begin process at 2013 06 20 05:11:15
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POUR LE CALCUL DES INTÉGRALES

UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POUR LE CALCUL DES INTÉGRALES


 Description

Utilisation de l'algorithme de scan pour le calcul de l'aire sous la courbe d'une fonction f ===> intégrale.
L'algorithme de scan est le plus basique j'ajouterais plus tard des versions plus performants.
C'est un code fait rapidement qui fonctionne correctement.
Dans cet example je calcule l'intégrale de x² entre 0..1 avec un pas de 0.001, mais vous pouvez modifier ces paramètres et prendre une autre fonction.

Source

  • #include <cuda.h>
  • #include <cuda_runtime.h>
  • #include <stdlib.h>
  • #include <iostream>
  • __device__ double f( double const x )
  • {
  • double res = x*x;
  • return res;
  • }
  • __device__ double Trap( double const h, double const a, double const b)
  • {
  • double Base = f(b);
  • double base = f(a);
  • double Aire = h*( Base + base )/2;
  • return Aire;
  • }
  • template<int BLOCKSIZE>
  • __global__ void scan( double* vect, double* sum, int n)
  • {
  • int i = threadIdx.x + blockDim.x*blockIdx.x;
  • int tx = threadIdx.x;
  • __shared__ double shared_mem[BLOCKSIZE];
  • if( tx < BLOCKSIZE && i < n )
  • shared_mem[threadIdx.x] = vect[i];
  • __syncthreads();
  • for(int step = 1 ; step < BLOCKSIZE; step *= 2)
  • {
  • int index = tx + step;
  • if( tx%2 == 0 && i < n && index < BLOCKSIZE )
  • {
  • shared_mem[tx] += shared_mem[index];
  • }
  • __syncthreads();
  • }
  • if( tx == 0)
  • sum[blockIdx.x] = shared_mem[tx];
  • __syncthreads();
  • }
  • __global__ void InitVect(double* vect, double a, double b, double h, int n)
  • {
  • int i = threadIdx.x + blockDim.x*blockIdx.x;
  • double x = a + i*h;
  • if( i < n )
  • vect[i] = Trap(h, x, x + h);
  • }
  • double CalculIntegrale( double a, double b, int n)
  • {
  • double h = (b - a )/n;
  • double* vect;
  • double* sum_h, *sum_d;
  • double res = 0;
  • int size = ceil( (float)n/256);
  • sum_h = new double[size];
  • cudaMalloc( (void**)&vect, n*sizeof(double));
  • if( cudaGetLastError() != cudaSuccess )
  • std::cout << "Malloc 1 "<<cudaGetErrorString(cudaGetLastError()) << std::endl;
  • cudaMalloc( (void**)&sum_d, size*sizeof(double));
  • if( cudaGetLastError() != cudaSuccess )
  • std::cout << "Malloc 2 "<<cudaGetErrorString(cudaGetLastError()) << std::endl;
  • dim3 grid(ceil( (float)n/256),1,1 );
  • dim3 block( 256,1,1);
  • InitVect<<<grid, block>>>(vect, a, b, h, n);
  • cudaThreadSynchronize();
  • if( cudaGetLastError() != cudaSuccess )
  • std::cout << "Vect Init "<<cudaGetErrorString(cudaGetLastError()) << std::endl;
  • scan<256><<<grid, block >>>(vect, sum_d,n);
  • cudaThreadSynchronize();
  • if( cudaGetLastError() != cudaSuccess )
  • std::cout << "Scan "<<cudaGetErrorString(cudaGetLastError()) << std::endl;
  • cudaMemcpy( sum_h, sum_d, size*sizeof(double), cudaMemcpyDeviceToHost);
  • if( cudaGetLastError() != cudaSuccess )
  • std::cout << "Memcpy 1 "<<cudaGetErrorString(cudaGetLastError()) << std::endl;
  • for(int i = 0; i < size; ++i)//Boucle pour finir la somme
  • res += sum_h[i];
  • cudaFree( vect );
  • cudaFree( sum_d );
  • delete[] sum_h;
  • return res;
  • }
  • int main(int argc, char* argv[])
  • {
  • double integral = CalculIntegrale(0.,1.,1000);
  • std::cout << integral << std::endl;
  • return 0;
  • }
#include <cuda.h>
#include <cuda_runtime.h>
#include <stdlib.h>
#include <iostream>


__device__ double f( double const x )
{
	double res = x*x;
	return res;
}

__device__ double Trap( double const h, double const a, double const b)
{
  double Base = f(b);
  double base = f(a);
  double Aire = h*( Base + base )/2;
  return Aire;
}


template<int BLOCKSIZE>
__global__ void scan( double* vect, double* sum, int n)
{
  int  i = threadIdx.x + blockDim.x*blockIdx.x;
  int tx = threadIdx.x;
  __shared__ double shared_mem[BLOCKSIZE]; 

  if( tx < BLOCKSIZE && i < n )
    shared_mem[threadIdx.x] = vect[i];
  __syncthreads();
  for(int step = 1 ; step < BLOCKSIZE; step *= 2)
    {
      int index = tx + step;
      if( tx%2 == 0 && i < n && index  < BLOCKSIZE )
	{
	  shared_mem[tx] += shared_mem[index];	
	}
      __syncthreads();
    }
  if( tx == 0)
    sum[blockIdx.x] = shared_mem[tx];
  __syncthreads();
}


__global__ void InitVect(double* vect, double a, double b, double h, int n)
{
  int i = threadIdx.x + blockDim.x*blockIdx.x;
  double x = a + i*h;
  if( i < n )
    vect[i] = Trap(h, x, x + h);
}


double CalculIntegrale( double a, double b, int n)
{
  double h = (b - a )/n;
  double* vect;
  double* sum_h, *sum_d;
  double res = 0;
  int size = ceil( (float)n/256);
  sum_h = new double[size];
  cudaMalloc( (void**)&vect, n*sizeof(double));
  if( cudaGetLastError() != cudaSuccess )
    std::cout << "Malloc 1  "<<cudaGetErrorString(cudaGetLastError()) << std::endl;
  cudaMalloc( (void**)&sum_d, size*sizeof(double));
  if( cudaGetLastError() != cudaSuccess )
    std::cout << "Malloc 2 "<<cudaGetErrorString(cudaGetLastError()) << std::endl;

  dim3 grid(ceil( (float)n/256),1,1 );
  dim3 block( 256,1,1);
  InitVect<<<grid, block>>>(vect, a, b, h, n);
  cudaThreadSynchronize();
  if( cudaGetLastError() != cudaSuccess )
    std::cout << "Vect Init "<<cudaGetErrorString(cudaGetLastError()) << std::endl;
  scan<256><<<grid, block >>>(vect, sum_d,n);
  cudaThreadSynchronize();
  if( cudaGetLastError() != cudaSuccess )
    std::cout << "Scan "<<cudaGetErrorString(cudaGetLastError()) << std::endl;
  
  cudaMemcpy( sum_h, sum_d, size*sizeof(double), cudaMemcpyDeviceToHost);
  if( cudaGetLastError() != cudaSuccess )
    std::cout << "Memcpy 1  "<<cudaGetErrorString(cudaGetLastError()) << std::endl;
  

  for(int i = 0; i < size; ++i)//Boucle pour finir la somme 
    res += sum_h[i];

  cudaFree( vect );
  cudaFree( sum_d );
  delete[] sum_h;
  return res;
}

int main(int argc, char* argv[])
{
  
  double integral = CalculIntegrale(0.,1.,1000);
  std::cout << integral << std::endl;
  return 0;
}

  


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • reduce_gpu.cuTélécharger ce fichier [Réservé aux membres club]2 602 octets

Télécharger le zip


 Sources de la même categorie

Source avec Zip LE PROBLÈME DU VOYAGEUR DE COMMERCE EN LANGAGE C (ANT SYSTEM... par casseur
Source avec Zip VECTEUR CREUX par stroke599
Source avec Zip Source avec une capture FONCTIONS EN ACTION par ringo73
CALCUL DE PI AVEC LA BIBLIOTHÈQUE GMP par lann
Source avec Zip Source avec une capture MAGEO3D, POUR GÉRER LES POINTS ET LES VECTEURS DE L'ESPACE R... par pgl10

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture ALGORITHME ACO TOILE D'ARAIGNÉE par RyBeN
Source avec Zip Source avec une capture TRAITEMENT D'IMAGE EN C++, QT par Akham75
Source avec Zip Source avec une capture RÉSOLUTION SUDOKU (9X9) PAR BACKTRACKING RÉCURSIF INTELLIGEN... par Gallien69
GÉRER UN COMBAT DANS UN JEU 2D / ALGORITHME PRIMAIRE D'UNE I... par Chiheb2010
Source avec Zip BELLMAN:LA VALEUR DU PLUS COURT CHEMIN ET LE PLUS COURT CHEM... par Perace

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Algorithme de compression STAR amélioré [ par hi_vivie2 ] Bonjour à tous,Je dois réaliser de manière urgente l'implémentation en java de l'algorithme de compression STAR amélioré appliqué aux images en mouvem Algorithme de compression STAR amélioré [ par hi_vivie2 ] Bonjour à tous,Je dois réaliser de manière urgente l'implémentation en java de l'algorithme de compression STAR amélioré appliqué aux images en mouvem un programme à creer [ par yoyo ] je dois creer un programme permettant d trouver les nombres premiers.l'algorithme est donné, et il utilise des tableaux dont les cases sont remplies p Qui sait l'algorithme pour calculer les racines? [ par TMT ] Aidez-moi! conversion de la partie fractionnaire en base n [ par Alucard ] J'ai vu qu'il y avait beaucoup d'algorithme de la partie entière (int) d'un nombre en n'importe quel base mais je voulais savoir si quelqu'un avait un Algorithme de mélange [ par C2S ] bonjour, j'aimerais connaitre un algorithme de mélange d'un tableau... (aléatoire) ... c'est pour simuler une fonction "mélanger" relative a un paquet aide sur l'algorithme AMR [ par semecurbep ] Votre texte iciVotre texte ICIVotre texte ICI map basic?????? [ par Sfoued2003 ] slt tout le monde,je me demande si je peux faire implémenter un algorithme de Electre1 sur map basic, pour pouvoir l'utiliser aprés sur map info? et ç algorithme de gauss et decomposition LU [ par speedamine ] bonjour a tous.je voudrai avoir des algorithmes ,ecrits en borland pascal,suivants:methode de gauss ordinaire pour la resolution d'un systeme .la deco Algorithme conversion Noms longs <-> Noms courts [ par franck406 ] Je suis à la recherche de l'algorithme qui permet d'obtenir un nom fichier court à partir d'un nom de fichier long comme le fait Dos. Je dois écrire u


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Juin 2013
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,530 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales