gpt4 book ai didi

c++ - OpenCL,从主机管理设备缓冲区指针?

转载 作者:行者123 更新时间:2023-12-03 12:49:09 27 4
gpt4 key购买 nike

我正在尝试使用 OpenCL 实现之前在 CUDA 中编写的代码,以便在 Altera FPGA 上运行。我在读回应该位于缓冲区中的数据时遇到问题。我使用与 CUDA 版本相同的结构,唯一不同的是 cudaMalloc 可以为所有类型的指针分配内存,而对于 clCreateBuffer 我必须使用 cl_mem。我的代码如下所示:

cl_mem d_buffer=clCreateBuffer(...);
//CUDA version:
//float* d_buffer;
//cudaMalloc((void **)&d_buffer, MemSz);

clEnqueueWriteBuffer(queue, d_buffer, ..., h_data, );
//cudaMemcpy(d_buffer, h_Data, MemSz, cudaMemcpyHostToDevice);

#define d_buffer(index1, index2, index3) &d_buffer + index1/index2*index3
//#define d_buffer(index1, index2, index3) d_buffer + index1/index2*index3

cl_mem* d_data=d_buffer(1,2,3);

clEnqueueReadBuffer(queue, *d_data,...)// Error reading d_data

我为 clCreateBuffer 尝试了 clEnqueueMapBuffer 或 CL_MEM_ALLOC_HOST_PTR,它也不起作用。

最佳答案

cl_mem 是一个不透明对象。您不应该对其执行指针算术;尝试这样做会导致非常讨厌的错误。

我不熟悉 CUDA 如何处理缓冲区分配,但注释掉的代码的含义是 CUDA 缓冲区始终是主机可见的。 OpenCL 中的情况并非如此。 OpenCL 允许您将缓冲区“映射”到主机可见的内存,但它不会对主机隐式可见。如果您打算读取缓冲区的任意索引,则需要先将其映射或将其复制到主机数据。

float * h_data = new float[1000];
cl_mem d_buffer=clCreateBuffer(...);

clEnqueueWriteBuffer(queue, d_buffer, true, 0, 1000 * sizeof(float), h_data, 0, nullptr, nullptr);
//======OR======
//float * d_data = static_cast<float*>(clEnqueueMapBuffer(queue, d_buffer, true, CL_MAP_WRITE, 0, 1000 * sizeof(float), 0, nullptr, nullptr, nullptr));
//std::copy(h_data, h_data + 1000, d_data);
//clEnqueueUnmapMemObject(queue, d_buffer, d_data, 0, nullptr, nullptr);
//clEnqueueBarrier(queue);

//Do work with buffer, probably in OpenCL Kernel...

float result;
size_t index = 1 / 2 * 3; //This is what you wrote in the original post
clEnqueueReadBuffer(queue, d_buffer, true, index * sizeof(float), 1 * sizeof(float), &result, 0, nullptr, nullptr);
//======OR======
//float * result_ptr = static_cast<float*>(clEnqueueMapBuffer(queue, d_buffer, true, CL_MAP_READ, index * sizeof(float), 1 * sizeof(float), 0, nullptr, nullptr, nullptr));
//result = *result_ptr;
//clEnqueueUnmapMemObject(queue, d_buffer, result_ptr, 0, nullptr, nullptr);
//clEnqueueBarrier(queue);

std::cout << "Result was " << result << std::endl;

关于c++ - OpenCL,从主机管理设备缓冲区指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46592296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com