私はこのテスト アプリケーションを 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 名前空間で関数を作成すると、完全に機能しました。