Visual c++ 这个cuda的openCL等价物是什么;cudaMallocPitch“;代码。?

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

我的电脑有一个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);
在这里。它给出了类似于

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);