-1

私はこのテスト アプリケーションを C++ と OpenCL で開発していますが、セグメンテーション エラーがさらに発生するこの非常に奇妙な問題が発生する理由がわかりません。

コードの一部:

output = new cl_float[TestCount*TrainCount]; // output array
output_buf = new cl::Buffer(*context, CL_MEM_WRITE_ONLY, sizeof(cl_float)*TestCount*TrainCount, NULL);
// .... some more stuff
queue->enqueueReadBuffer(*output_buf, CL_TRUE, 0, TestCount*TrainCount, output);

ここで、output と output_buf はそれぞれのデータへのポインターです。

すべてが処理された後、出力配列の任意の要素にアクセスしようとすると、seg-fault が発生します。さらにデバッグすると、格納されている要素の最大数は 562 であることがわかりましたが、2250 である必要があります (TestCount=150、TrainCount=15)。さらに、驚くべきことに、GDB の任意の要素にアクセスできますが、562 以上にはアクセスできません。

コードにエラーがないことは疑いの余地がなく、すべての 2250 出力が GPU によって処理されていることは間違いありません。これは、各スレッドで出力配列の最初の要素をアトミックにインクリメントし、GDB 経由で出力することでテストしていました。

多くの可能性を除外したようですが、一体何がこの問題の原因なのかまだわかりません。ヒープがいっぱいになる可能性はほとんどありませんが、アプリケーションが 37M のメモリしか使用していないことがわかりました。

どんな助けでも大歓迎です!

更新:ジェームズは正しいです。メモリから十分なバイト数を読み取れなかったことが原因でした。seg-fault のバックトレースは次のとおりです。

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x000000000000000c
0x0000000100002402 in main (argc=4, argv=0x7fff5fbffb88)
    at TestApplication.cpp:202
202     cout << OpenCL_KNN::output[0] << " " << OpenCL_KNN::output[1] << " " << OpenCL_KNN::output[2] << " " << OpenCL_KNN::output[3];

アクセスされる 4 つのインデックスは明確に定義されています。この行の前にエラーが発生することはありません。出力配列は、前に述べた以外の場所で変更/作成されていません。

更新 2 : エラーは解決されました。これは Mac OS X でのみ発生していました。出力にアクセスする方法と何か関係がありました。出力を返す OpenCL_KNN 名前空間で関数を作成すると、完全に機能しました。

4

2 に答える 2

2

CLのC++ラッパーには慣れていませんが、GPUから読み戻すにはバイト数TestCount*TrainCountが少なすぎる要因だと思います。sizeof(cl_float)コードは次のようになります。

queue->enqueueReadBuffer(*output_buf, CL_TRUE, 0, sizeof(cl_float)*TestCount*TrainCount, output);

ただし、それはあなたのセグメンテーション違反を説明していません。おそらくあなたは他の場所で同じエラーを犯していますか?

于 2012-07-12T03:34:24.930 に答える
0

このエラーは、初期化されていないか削除されているメモリにアクセスしているために発生しています。エラーはこのコード行にあります。

queue->enqueueReadBuffer(*output_buf, CL_TRUE, 0, TestCount*TrainCount, output);

コード内のすべてのオブジェクトと変数 (ポインター) が適切に初期化されているかどうかを確認してください。それが完了すると、このエラーはなくなります。指定されたコード行でエラーを生成する必要はありません。アクセスした位置で発生する可能性があります。初期化されていないメモリ アドレス。

于 2012-07-12T04:20:05.657 に答える