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 ...
Quelles sont les dimensions de 'A'? – user463035818
@ 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'. –