私の PC には、OpenCL をサポートしていない ATI 3200 GPU を搭載した AMD プロセッサが搭載されています。残りのコードはすべて「CPU自体にフォールバック」して実行されます。
コードの 1 つを CUDA から OpenCL に変換していますが、OpenCL に正確な変換コードがない特定の部分でスタックしています。私は OpenCL の経験が少ないため、これを理解することはできません。うまくいくと思われる解決策を提案してください。
CUDAコードは、
size_t pitch = 0;
cudaError error = cudaMallocPitch((void**)&gpu_data, (size_t*)&pitch,
instances->cols * sizeof(float), instances->rows);
for( int i = 0; i < instances->rows; i++ ){
error = cudaMemcpy((void*)(gpu_data + (pitch/sizeof(float))*i),
(void*)(instances->data + (instances->cols*i)),
instances->cols * sizeof(float) ,cudaMemcpyHostToDevice);
上記からピッチ値を削除すると、デバイス メモリ "gpu_data" に書き込まれないという問題が発生します。
誰かこのコードを OpenCL に変換して返信してください。OpenCL に変換しましたが、動作せず、データが "gpu_data" に書き込まれません。私の変換されたOpenCLコードは
gpu_data = clCreateBuffer(context, CL_MEM_READ_WRITE, ((instances->cols)*(instances->rows))*sizeof(float), NULL, &ret);
for( int i = 0; i < instances->rows; i++ ){
ret = clEnqueueWriteBuffer(command_queue, gpu_data, CL_TRUE, 0, ((instances->cols)*(instances->rows))*sizeof(float),(void*)(instances->data + (instances->cols*i)) , 0, NULL, NULL);
このコードではうまく動作し、読み取り部分でスタックすることがあります。
ret = clEnqueueReadBuffer(command_queue, gpu_data, CL_TRUE, 0,sizeof( float ) * instances->cols* 1 , instances->data, 0, NULL, NULL);
あそこに。そして、それは次のようなエラーを出します
CL_kmeans.exe の 0x10001098 で未処理の例外: 0xC000001D: 不正な命令。
ブレークが押されると、次のようになります。
コール スタック フレームのシンボルは読み込まれません。ソースコードを表示できません。
デバッグ中。コール スタックでは、次のように表示されます。
OCL8CA9.tmp.dll!10001098()
[以下のフレームは、OCL8CA9.tmp.dll のシンボルがロードされていないため、正しくないか欠落している可能性があります]
amdocl.dll!5c39de16()
私はそれが何を意味するのか本当にわかりません。誰かがこの問題を取り除くのを手伝ってください。