2017-05-17 1 views
0

je traite des matrices diagonales de blocs (chaque bloc a la même taille) et j'ai un illegal address error quand j'utilise private tableau 2D alloué dynamiquement ...OpenACC - tableau 2D privé

// NB is the number of block 
// N is the block size 
// A is the main matrix (block diagonal) 

double** B; // a block 
B = new double*[N]; 
for (unsigned int i = 0; i < N; i++) 
    B[i] = new double[N]; 

#pragma acc parallel loop private(B[:N][:N]) copyin(A[:NB*N][:NB*N]) 
for (unsigned int b = 0; b < NB; b++) { 
    #pragma acc loop 
    for (unsigned int i = 0; i < N; i++) { 
     #pragma acc loop 
     for (unsigned int j = 0; j < N; j++) { 
      B[i][j] = A[b*N+i][b*N+j]; 
     } 
    } 
    // process B 
} 

for (unsigned int i = 0; i < N; i++) 
    delete[] B[i]; 
delete[] B; 

L'erreur que je obtenir est:

call to cuStreamSynchronize returned error 700: Illegal address during kernel execution 

Il fonctionne très bien si j'Aplatissez le tableau dans un tableau 1D et utilisation de l'index lexicographique ou un tableau 2D statique, mais j'utilise la fonction nécessitant un double** en tant que paramètre donc je préfère rester avec 2D dynamique tableau ...

J'ai lu sur la private clause dans la spécification, mais il ne dit pas ce tableau 2D dynamiques ne sont pas pris en charge, donc je suppose que je fais quelque chose de mal ...

+0

Quelles sont les dimensions de 'A'? – user463035818

+0

@ tobi303 'A' est une matrice' N * NBxN * NB'. Désolé 'A' est ** bloc diagonal **, je viens de l'éditer. Chaque bloc est une matrice 'NxN' et' A' est composé de blocs 'NB'. –

Répondre

3

Désolé, mais en utilisant un tableau de pointeurs dans une clause privée n'est pas supporté. Le problème étant que le runtime du compilateur devrait créer dynamiquement un private pour chaque gang, worker ou vector (en fonction de la boucle avec la clause private) et remplir tous les pointeurs de périphériques. Cela entraînerait des frais généraux extrêmement élevés. Si "B" est un tableau statique de taille fixe, "double B [N] [N]", vous pouvez l'utiliser dans la clause private. Sinon, je suggère de privatiser manuellement le tableau en ajoutant une troisième dimension.

// NB is the number of block 
// N is the block size 
// A is the main matrix (block diagonal) 

double*** B; // a block 
B = new double**[NB]; 
for (unsigned int i = 0; i < NB; i++) { 
    B[i] = new double*[N]; 
    for (unsigned int j = 0; j < N; j++) { 
    B[i][j] = new double[N]; 
}} 


#pragma acc parallel loop create(B[:NB][:N][:N]) copyin(A[:NB*N][:NB*N]) 
for (unsigned int b = 0; b < NB; b++) { 
    #pragma acc loop 
    for (unsigned int i = 0; i < N; i++) { 
     #pragma acc loop 
     for (unsigned int j = 0; j < N; j++) { 
      B[b][i][j] = A[b*N+i][b*N+j]; 
     } 
    } 
    // process B 
} 

for (unsigned int i = 0; i < NB; i++) { 
    for (unsigned int j = 0; j < N; j++) { 
    delete[] B[i][j]; 
    } 
    delete[] B[i]; 
} 
delete[] B;