我有以下代码:
#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
程序可以编译运行成功
为什么会这样,我如何在这里使用 struct "polygon2"?