Visual c++ 这个cuda的openCL等价物是什么;cudaMallocPitch“;代码。?
我的电脑有一个AMD处理器,带有不支持OpenCL的ATI 3200 GPU。其余的代码都是通过“退回到CPU本身”来运行的 我正在将其中一个代码从CUDA转换为OpenCL,但在OpenCL中没有确切的转换代码的特定部分卡住了。由于我在OpenCL方面的经验较少,我无法理解这一点,请向我建议一些解决方案,如果你们中的任何人认为可行 CUDA代码是Visual c++ 这个cuda的openCL等价物是什么;cudaMallocPitch“;代码。?,visual-c++,opencl,gpu,amd-processor,Visual C++,Opencl,Gpu,Amd Processor,我的电脑有一个AMD处理器,带有不支持OpenCL的ATI 3200 GPU。其余的代码都是通过“退回到CPU本身”来运行的 我正在将其中一个代码从CUDA转换为OpenCL,但在OpenCL中没有确切的转换代码的特定部分卡住了。由于我在OpenCL方面的经验较少,我无法理解这一点,请向我建议一些解决方案,如果你们中的任何人认为可行 CUDA代码是 size_t pitch = 0; cudaError error = cudaMallocPitch((void**)&gpu_da
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);
在这里。它给出了类似于
CL_kmeans.exe中0x10001098处未处理的异常:0xC000001D:非法指令
按下“中断”按钮时,会显示:
没有为任何调用堆栈帧加载任何符号。无法显示源代码
调试时。在调用堆栈中显示:
OCL8CA9.tmp.dll!10001098()[以下帧可能不正确和/或缺失,没有为OCL8CA9.tmp.dll加载符号]
amdocl.dll!5c39de16()
我真的不知道这是什么意思。有人请帮我解决这个问题。首先,在CUDA代码中,复制数据的效率非常低。CUDA运行时具有函数
cudaMemcpy2D
,该函数通过在不同的行上循环来执行您正试图执行的操作
cudaMallocPitch
所做的是计算一个最佳节距(=2D数组中行与行之间的字节距离),使每一新行从一个最适合合并的地址开始,然后分配一个与节距乘以指定行数一样大的内存区域。您可以在OpenCL中模拟同样的事情,首先计算最佳音高,然后进行正确大小的分配
通过(1)获取卡的基址对齐首选项(clGetDeviceInfo的CL_DEVICE_MEM_base_ADDR_ALIGN属性:注意,返回值以位为单位,因此必须除以8才能获得字节数)来计算最佳间距;让我们称之为base
(2)找到base
的最大倍数,该倍数不小于您的自然数据间距(sizeof(type)乘以列数);这将是您的音高
然后分配pitch
乘以行字节数,并将pitch
信息传递给内核
另外,在将数据从主机复制到设备时,您希望使用专门设计用于复制2D数据的
clEnqueue{Read,Write}BufferRect
(它们与cudaMemcpy2D
相对应)。首先,在CUDA代码中,复制数据的效率非常低。CUDA运行时具有函数cudaMemcpy2D
,该函数通过在不同的行上循环来执行您正试图执行的操作
cudaMallocPitch
所做的是计算一个最佳节距(=2D数组中行与行之间的字节距离),使每一新行从一个最适合合并的地址开始,然后分配一个与节距乘以指定行数一样大的内存区域。您可以在OpenCL中模拟同样的事情,首先计算最佳音高,然后进行正确大小的分配
通过(1)获取卡的基址对齐首选项(clGetDeviceInfo的CL_DEVICE_MEM_base_ADDR_ALIGN属性:注意,返回值以位为单位,因此必须除以8才能获得字节数)来计算最佳间距;让我们称之为base
(2)找到base
的最大倍数,该倍数不小于您的自然数据间距(sizeof(type)乘以列数);这将是您的音高
然后分配pitch
乘以行字节数,并将pitch
信息传递给内核
此外,在将数据从主机复制到设备时,您需要使用专门设计用于复制二维数据的clEnqueue{Read,Write}BufferRect
(它们与cudaMemcpy2D
对应)
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);