Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL中内存复制不正确_Opencl - Fatal编程技术网

OpenCL中内存复制不正确

OpenCL中内存复制不正确,opencl,Opencl,我的openCL程序中出现了一些不寻常的行为 在程序的主机部分,我创建了一个double数组,并将所有元素设置为零。使用以下方法将该阵列复制到GPU: memObjects[4] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(double) * I_numel, I, NULL); 在内核中,某些元素根据某些条件设置为1,然后我使用以

我的openCL程序中出现了一些不寻常的行为

在程序的主机部分,我创建了一个double数组,并将所有元素设置为零。使用以下方法将该阵列复制到GPU:

memObjects[4] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
                             sizeof(double) * I_numel, I, NULL);
在内核中,某些元素根据某些条件设置为1,然后我使用以下命令将其读回主机:

errNum = clEnqueueReadBuffer(commandQueue, memObjects[4], CL_TRUE, 0,
                           I_numel * sizeof(double), I, 0, NULL, NULL);
但是,一些本应为零的元素已更改为非常小(6.953267903e-310)或非常大的数字(2.0002319483e+161)


我尝试过将double改为float,但结果相似。我使用的是nvidia实现的openCL,版本是1.1。有人知道问题出在哪里吗?

我怀疑您的内核代码有问题。如果只执行clEnqueueRead而根本不运行内核,会发生什么情况,那么会得到全零吗?如果您删除CL_MEM_COPY_HOST_PTR并用clEnqueueWrite清除缓冲区,会怎么样

我试图用这个简化的内核重现这个问题,但正如预期的那样,输出只是交替的0和1:

kernel void enqueueReadBuffer(global float* outputValueArray) {
  int gid = get_global_id(0);
  if (gid % 2 == 0) {
    outputValueArray[gid] = 1.0f;
  }
}

我在Windows 7上的三个不同OpenCL驱动程序(包括NVIDIA Quadro FX4800(R307.45))上运行了此命令,并在所有这些驱动程序上都得到了正确的结果。

尝试用此命令替换显示的代码,然后发布错误号

cl_int err;
memObjects[4] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
                             sizeof(double) * I_numel, I, &err);

printf("Buffer creation error no = %d", err);
和用于回抄的

cl_int err2;
err2= clEnqueueReadBuffer(commandQueue, memObjects[4], CL_TRUE, 0,
                           I_numel * sizeof(double), I, 0, NULL, NULL);
printf("Copy back error no = %d", err2);

内核绝对不是问题!内存复制有一些问题!看看这个简单的例子:双a[10];对于(int i=0;i得到的输出是:0.5 2.5 4.5 6.5 8.5我得到的输出是:0.5 6.906593604e-310 2.5 0 4.5 2.080526245e-317 6.5 6.906593843e-310 8.5 2.96439875E-323 2.96439875E-323@user1894442你的“简单例子”有一个bug-您在每个循环中递增
i
两次,因此只有偶数项有一个值,而非偶数项包含垃圾。