Bonjour,

Dans le cadre d'un stage, je dois parallèliser une appli en utilisant entre autre CUDA. Je dois également faire des tests de performance pour montrer l'intérêt d'utiliser GPGPU. Pour ce test, je fais une simple multiplication de 2 matrices carrées de flottants, rien de bien compliqué.

Malheureusement, je suis confronté à un petit souci : lorsque je fais des matrices plus grandes que 22x22, la matrice résultat ne contient que des 0. Voici les specs de la carte graphique en utilisant cudaGetDeviceProperties() :
Name: GeForce 8400 GS
Memory: 255 MB
Memory/Blck: 16 kB
Clock: 1250 MHz
Multiproc. Count: 1
Max Threads/Block : 512
MaxThreadsDim : 512 512 64
MaxGridSize: 65535 65535 1
Voici les portions de code importantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
#define MATRIX_WIDTH 22 // Si > 22, problème
#define MEMSIZE MATRIX_WIDTH*MATRIX_WIDTH * sizeof( float )
 
__global__ void multMatrixKernel( float* A, float* B, float* R )
{
   float res = 0;
   for( unsigned int i = 0; i < MATRIX_WIDTH; ++i )
   {
      float e1 = A[threadIdx.y * MATRIX_WIDTH + i];
      float e2 = A[i                 * MATRIX_WIDTH + threadIdx.x];
      res += e1 * e2;
   }
 
   R[threadIdx.y * MATRIX_WIDTH + threadIdx.x] = res;
}
 
void multMatrixGPU( float* A, float* B )
{
   float* dA;
   float* dB;
   float* dR;
 
   float* R = (float*) malloc( MEMSIZE );
 
   cudaMalloc( (void**) &dA, MEMSIZE );
   cudaMalloc( (void**) &dB, MEMSIZE );
   cudaMalloc( (void**) &dR, MEMSIZE );
 
   cudaMemset( dR, 0x00, MEMSIZE );
 
   cudaMemcpy( dA, A, MEMSIZE, cudaMemcpyHostToDevice );
   cudaMemcpy( dB, B, MEMSIZE, cudaMemcpyHostToDevice );
 
   multMatrixKernel<<<1, dim3( MATRIX_WIDTH, MATRIX_WIDTH )>>>( dA, dB, dR );
 
   cudaMemcpy( R, dR, MEMSIZE, cudaMemcpyDeviceToHost );
 
   cudaFree( dA );
   cudaFree( dB );
   cudaFree( dR );
 
   writeMatrix( "GPU.out", R );
 
   free( R );
}
Précisions supplémentaires : la machine est sous Ubuntu x64 et l'utilisation d'un plus grand nombre de blocks est la prochaine étape ;-)

Merci d'avance pour votre aide!
S.