我有一个 C 程序来查找 2 组多边形是否重叠。用户输入 2 组多边形(每组数据有数千个多边形),程序查看 set1 中的哪个多边形与 set2 中的哪个多边形重叠
我有2个这样的结构:
struct gpc_vertex /* Polygon vertex */
{
double x;
double y;
};
struct gpc_vertex_list /* Polygon contour */
{
int pid; // polygon id
int num_vertices;
double *mbr; // minimum bounding rectangle of the polygon, so always 4 elements
};
我有以下代码段:
#pragma acc kernels copy(listOfPolygons1[0:polygonCount1], listOfPolygons2[0:polygonCount2], listOfBoolean[0:dump])
for (i=0; i<polygonCount1; i++){
polygon1 = listOfPolygons1[i];
for (j=0; j<polygonCount2; j++){
polygon2 = listOfPolygons2[j];
idx = polygonCount2 * i + j;
listOfBoolean[idx] = isRectOverlap(polygon1.mbr, polygon2.mbr); // line 115
}
}
listOfPolygons1 和 listOfPolygons2 (顾名思义)是一个 gpc_vertex_list 数组。listOfBoolean 是一个 int 数组。
检查 2 个多边形的 mbr 以查看它们是否重叠,如果是,函数“isRectOverlap”返回 1,如果不是,则返回 0,并将值放入 listOfBoolean
问题
代码可以编译但不能运行。它返回以下错误:
call to cuEventSynchronize returned error 700: Illegal address during kernel execution
我的观察
该程序可以通过将第 115 行更改为以下内容来编译和运行:
isRectOverlap(polygon1.mbr, polygon2.mbr); // 不给 listOfBoolean 赋值
或这个:
listOfBoolean[idx] = 5; // 分配一个任意值
(虽然结果是错误的,但至少,它可以运行)
问题
如果值没有从“isRectOverlap”传递到“listOfBoolean”,“isRectOverlap”和“listOfBoolean”似乎都不会产生问题
有谁知道如果我将“isRectOverlap”的返回值分配给“ listOfBoolean”?
isRectOverlap 函数是这样的:
int isRectOverlap(double *shape1, double *shape2){
if (shape1[0] > shape2[2] || shape2[0] > shape1[2]){
return 0;
}
if (shape1[1] < shape2[3] || shape2[1] < shape1[3]){
return 0;
}
return 1;
}
程序不在OpenACC中运行时没有问题
感谢您的帮助