私はブロック対角行列を扱っています(各ブロックは同じ大きさを持っている)、私はprivate
動的に割り当てられた2次元配列を使用する場合、私はillegal address error
を持っている...OpenACC - プライベート2D配列
// 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;
エラーI取得です:
call to cuStreamSynchronize returned error 700: Illegal address during kernel execution
ので、私は、ダイナミック2Dに固執することを好むだろう、私は1次元配列に配列を平らにし、辞書式インデックスまたは静的な2次元配列を使用する場合、それは正常に動作しますが、私は、パラメータとしてdouble**
を必要とする機能を使用しています配列...
私はスペックにprivate
句にまで読んだが、それは私が何か間違ったことをやっていると仮定しているダイナミックな2次元配列がそのようにサポートされていないと言っていません...
「A」の寸法は何ですか? – user463035818
@ tobi303 'A 'は' N * NBxN * NB'マトリックスです。申し訳ありません、 'A'は**ブロック対角です**、私はそれを編集しました。各ブロックは「N×N」行列であり、「A」は「NB」ブロックで構成される。 –