0

次のコードがあります。

#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」を使用するにはどうすればよいですか?

4

0 に答える 0