2組のポリゴンが重なっているかどうかを調べるCプログラムがあります。私はopenACC構造体のリストを渡す
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
};
:ユーザ入力2点のポリゴンの集合(データの各セットは数千のポリゴンを持つ)、プログラムは、私はこのような2構造体を有するSET2
のどのポリゴンとSET1重複のどのポリゴン参照します次のコードセグメント:
#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」彼らがある場合、そうでない場合は、0を1に戻し、listOfBooleanする値を入れ
問題
コードはコンパイルできますが実行できません。これは、次のエラーを返します。
call to cuEventSynchronize returned error 700: Illegal address during kernel execution
私の観察
プログラムは、これにライン115を変更してコンパイルして実行することができます
isRectOverlap(polygon1.mbr, polygon2.mbr); // without assigning value to listOfBoolean
またはこの:
listOfBoolean[idx] = 5; // assigning an arbitrary value
(結果は間違っていますが、少なくとも実行可能です)
質問
値が「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に集計データ型がOpenACCに使用されている場合は
CUDAですか?タグに示します。 –
私はそうは思わない?それはCUDAコードを持っていません。申し訳ありませんが、私は並列プログラミングには新しいです。 – dondonhk
私は 'cuEventSynchronize'を見ています。これは私には似ています....私はこのOpenACCに慣れていないので、間違っているかもしれません。 –