次のコードがあります。
#pragma acc data present(listOfPolygons1, listOfPolygons2, polygon1, polygon2) copy(listOfBoolean[0:numOfPolygonsPair])
#pragma acc parallel loop
// do point-in-polygon in this nested loop
for (i=0; i<polygonCount1; i++){
polygon1 = listOfPolygons1[i];
for (j=0; j<polygonCount2; j++){
polygon2 = listOfPolygons2[j];
idx = polygonCount2 * i + j;
if (listOfBoolean[idx]==0){
// don't even have an intersection
continue;
} else {
// do point-in-polygon test
for (k=0; k<polygon2.num_vertices; k++){ // line 139
}
}
}
}
「polygon1」と「polygon2」は構造体です。
「listOfPolygons1」と「listOfPolygons2」は、対応する「polygon1」と「polygon2」のリストを持つ構造体配列です。
「listOfBoolean」は int の配列です
「listOfPolygons1」と「listOfPolygon2」の両方がアクセラレータにディープ コピーされ、前のループで正常に使用されます (コードはここには示されていません)。
コードはコンパイルできますが、実行すると次のエラー メッセージが表示されます。
call to cuEventSynchronize returned error 716: Misaligned address
私の観察
問題は 139 行目にあるようです。「k<polygon2.num_vertices」を使用すると、前述のエラーが発生しました。
しかし、行を次のように変更すると:
for (k=0; k<listOfPolygons2[j].num_vertices; k++) // not using struct "polygon2"
(更新 1) またはこれ:
for (k=0; k<polygon1.num_vertices; k++) // use polygon1.num_vertices instead
プログラムは正常にコンパイルおよび実行できます
それはなぜですか?ここで構造体「polygon2」を使用するにはどうすればよいですか?