我的電腦有一個AMD處理器和一個不支持OpenCL的ATI 3200 GPU。剩下的代碼全部由「回退到CPU本身」運行。這個cuda「cudaMallocPitch」代碼的openCL等價物是什麼?
我將其中一個代碼從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);
overhere。並且它給出如下錯誤:
CL_kmeans.exe中0x10001098處未處理的異常:0xC000001D:非法指令。
壓破時,它給出:
否符號已加載的任何調用堆棧幀。源代碼無法顯示。
while debugging。在調用棧中它顯示:
OCL8CA9.tmp.dll 10001098()
[下面的幀可能是不正確的和/或缺失,沒有加載OCL8CA9.tmp.dll符號]
amdocl!。 dll!5c39de16()
我真的不知道這是什麼意思。有人請幫我解決這個問題。