OpenCl clEnqueueMapBuffer不';你不能正常工作吗?

OpenCl clEnqueueMapBuffer不';你不能正常工作吗?,opencl,Opencl,据我所知,您可以使用ClenqueueEmapBuffer访问内存对象。不使用读/写操作,您可以将设备上的内存对象映射到主机上的内存区域。 我编写了一个非常简单的代码来测试它。这段代码将charter“X”发送到GPU,内核向其中添加1,所以我们应该得到“Y”,但我没有。 似乎ClenqueunmapmemObject不会将存储在GPU内存中的结果复制到主机上的缓冲区! 这是我的代码: #include <iostream> #include <CL\cl.h> usin

据我所知,您可以使用ClenqueueEmapBuffer访问内存对象。不使用读/写操作,您可以将设备上的内存对象映射到主机上的内存区域。 我编写了一个非常简单的代码来测试它。这段代码将charter“X”发送到GPU,内核向其中添加1,所以我们应该得到“Y”,但我没有。 似乎ClenqueunmapmemObject不会将存储在GPU内存中的结果复制到主机上的缓冲区! 这是我的代码:

#include <iostream>
#include <CL\cl.h>
using namespace std;
#pragma warning(disable : 4996)
#define PROGRAM "__kernel void hello(__global char* string )\
{\
string[0] = string[0] + 1;\
}"

int main() {
cl_platform_id platform; cl_device_id device; cl_context context;
cl_program program; cl_int error; cl_build_status status;

char *programBuffer = PROGRAM;   

// make contex
clGetPlatformIDs(1, &platform, NULL);
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
context = clCreateContext(NULL, 1, &device, NULL, NULL, NULL);

//built program
program = clCreateProgramWithSource(context, 1, (const char**)&programBuffer, nullptr, NULL);
const char options[] = "-cl-std=CL1.1 -cl-mad-enable -Werror";
error = clBuildProgram(program, 1, &device, options, NULL, NULL);

// create kernel 
cl_command_queue   command_queue;
command_queue = clCreateCommandQueue(context, device, NULL, nullptr);
cl_kernel kernels, found_kernel;
cl_uint num_kernels;

error = clCreateKernelsInProgram(program, 0, nullptr, &num_kernels);
kernels = clCreateKernel(program, "hello", nullptr);
//make buffers
cl_mem memobj = clCreateBuffer(context, CL_MEM_ALLOC_HOST_PTR| CL_MEM_READ_WRITE, 2 * sizeof(char), nullptr, &error);//if nulptr nazarim then itt will retun null pointer
error = clSetKernelArg(kernels, 0, sizeof(cl_mem), (void *)&memobj);
// I am goign to send this data to GPU
char *CPU_2_GPU_Data = new char[2]{ "X" };
void* mapbuffer =clEnqueueMapBuffer(command_queue, memobj, CL_TRUE, CL_MAP_READ | CL_MAP_WRITE, 0, 2 * sizeof(char), 0, nullptr, nullptr, &error);
memccpy(mapbuffer, CPU_2_GPU_Data, 0, 2 * sizeof(char));
cout<<"I am sending this dat to GPU:"<<(char*)(mapbuffer)<<endl;
error = clEnqueueTask(command_queue, kernels, 0, nullptr, nullptr);
clEnqueueUnmapMemObject(command_queue, memobj, mapbuffer, 1, nullptr, nullptr);
cout << "I am getiing this data from GPU:" << (char*)(mapbuffer) << endl;
clReleaseContext(context);
return 0;
#包括
#包括
使用名称空间std;
#杂注警告(禁用:4996)
#定义程序“\uuu内核void hello(\uuu全局字符*字符串)\
{\
字符串[0]=字符串[0]+1\
}"
int main(){
cl_平台\u id平台;cl_设备\u id设备;cl_上下文;
cl_程序;cl_int错误;cl_构建状态;
char*programmabuffer=程序;
//制造上下文
clGetPlatformIDs(1,&平台,NULL);
CLGetDeviceID(平台,CL\U设备类型\U GPU,1和设备,空);
context=clCreateContext(NULL,1,&device,NULL,NULL,NULL);
//构建程序
program=clCreateProgramWithSource(上下文,1,(常量字符**)和programBuffer,nullptr,NULL);
常量字符选项[]=“-cl std=CL1.1-cl mad enable-Werror”;
error=clBuildProgram(程序、1和设备、选项、NULL、NULL);
//创建内核
cl_命令_队列命令_队列;
command_queue=clCreateCommandQueue(上下文、设备、NULL、nullptr);
cl_内核,找到了cl_内核;
核数;
error=clCreateKernelsInProgram(程序、0、空ptr和num_内核);
kernels=clCreateKernel(程序“hello”,nullptr);
//缓冲
cl_mem memobj=clCreateBuffer(上下文、cl_mem_ALLOC_HOST_PTR、cl_mem_READ_WRITE、2*sizeof(char)、nullptr和error);//如果nulptr nazarim,itt将重新运行空指针
error=clSetKernelArg(内核,0,sizeof(cl_mem),(void*)和memobj);
//我要把这些数据发送到GPU
char*CPU_2_GPU_Data=新字符[2]{“X”};
void*mapbuffer=clenqueueemapbuffer(命令队列、memobj、CL\u TRUE、CL\u映射读取、CL\u映射写入、0、2*sizeof(char)、0、nullptr、nullptr和error);
memccpy(映射缓冲区,CPU_2_GPU_数据,0,2*sizeof(char));
cout目的是:
1) 您可以通过映射在主机上读取它。
2) 然后取消映射,以便GPU可以再次使用它。
3) 然后再次映射以从主机读取它。
4) 然后取消映射以进行清理

您似乎正在映射、启动任务,然后取消映射。因此,在您尝试读取数据时,主机实际上无法再读取数据,因为您刚刚取消了映射!

目的是: 1) 您可以通过映射在主机上读取它。 2) 然后取消映射,以便GPU可以再次使用它。 3) 然后再次映射以从主机读取它。 4) 然后取消映射以进行清理


您似乎正在映射,启动一个任务,然后取消映射。因此,在您尝试读取数据时,主机实际上无法再读取它,因为您刚刚取消了映射!

感谢您的回复!如果我没有取消映射缓冲区,我仍然会得到错误的结果!根据您所说的,我必须1-Map 2-unmap 3-再次运行内核4-Map 5-数据现在已传输到主机6-取消映射,对吗?对。映射时,您需要在主机上读取,映射时,您需要在设备上读取。因此,如果您不取消映射,则GPU无法读取,因此这也不起作用。我尝试过,但不起作用!您有任何示例可以尝试吗?谢谢您的回答!如果我不取消映射buf,请回答如果我仍然得到错误的结果!根据你说的,我必须1-Map 2-unmap 3-再次运行内核4-Map 5-数据现在传输到主机6-unmap,对吗?对。你需要在映射时在主机上读取数据,在映射时在设备上读取数据。因此,如果你不取消映射,那么GPU就无法读取数据,所以这也不起作用。我试过了,但没用!你有什么例子可以试试吗?你用的是什么GPU?@Jovasa我用的是AMD Radeon R7 M270,还有一个Intel(R)HD Graphics 5500,你用的是什么GPU?@Jovasa我用的是AMD Radeon R7 M270,还有一个Intel(R)HD Graphics 5500
char* newbuffer = new char[2];
clEnqueueReadBuffer(command_queue, memobj, CL_TRUE, 0, 2 * sizeof(char), newbuffer, 0, nullptr, nullptr);
cout << "the result is :" << newbuffer << endl;