我的 PC 有一个 AMD 处理器和一个不支持 OpenCL 的 ATI 3200 GPU。其余代码全部通过“回退到 CPU 本身”运行。
我正在将其中一个代码从 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:非法指令。
当按下 break 时,它给出:
没有为任何调用堆栈帧加载符号。无法显示源代码。
调试时。在调用堆栈中显示:
OCL8CA9.tmp.dll!10001098()
[下面的帧可能不正确和/或丢失,没有为 OCL8CA9.tmp.dll 加载符号]
amdocl.dll!5c39de16()
我真的不知道这意味着什么。有人请帮我解决这个问题。