pointers - Intel HD Graphics 是否违反了有关 SVM 的 OpenCL 规范?

标签 pointers opencl svm nvidia intel

我正在尝试分配几个 SVM 缓冲区并使用以下方法将它们传递给 OpenCL 内核。内核运行在 Intel HD Graphics 530 和 NVIDIA GTX 950M 上。我在这些 GPU 上得到了不同的结果,我不确定哪种行为是正确的(也许两者都是?)

  1. 初始化 OpenCL。
  2. 通过 3 次 clSVMAlloc() 调用分配 3 个缓冲区(data0data1pointers)。
  3. 检查 NULL 的结果(这里没有失败)。
  4. 使用阻塞 clEnqueueSVMMap() 调用映射所有缓冲区 + 检查 CL_SUCCESS(这里没有失败)。
  5. 填写data0data1与数据,和pointers指向 data0 的指针和 data1 ,所以 pointers[0] == data0pointers[1] == data1 .
  6. 使用 clEnqueueSVMUnmap() 取消映射所有缓冲区 + 检查 CL_SUCCESS(这里没有失败)。
  7. 使用 clSetKernelArgSVMPointer(..., data0 ) 设置第一个内核参数 + 检查 CL_SUCCESS(这里没有失败)。
  8. 使用 clSetKernelArgSVMPointer(..., pointers ) 设置第二个内核参数 + 检查 CL_SUCCESS(这里没有失败)。
  9. 运行内核并测试结果。

在 NVIDIA 卡上,数据可通过 pointers[0] 获得和 pointers[1] .这是预期的行为。

在 Intel 芯片上,内存在后面pointers[0]可用(因为 data0 已设置为内核参数),但内存在 pointers[1] 后面全为零。如果我设置 data1作为内核参数,然后通过 pointers[1] 可用和背后的内存pointers[0]变为零。

问题是:英特尔的方法是错误还是功能?我在OpenCL 3.0规范中没有找到任何相关信息。

最佳答案

英特尔工作正常并遵守规范。然而,NVIDIA 更简单。

要解决所讨论的问题,需要不要忘记将一组 SVM 缓冲区传递给内核:

ret = clSetKernelExecInfo(kernel, CL_KERNEL_EXEC_INFO_SVM_PTRS, sizeof(svm_buffers), svm_buffers);

其中 svm_buffers 是指向使用 clSVMAlloc() 调用分配的缓冲区的指针的 void*[] 数组。

OpenCL 规范为带有参数 CL_KERNEL_EXEC_INFO_SVM_PTRSclSetKernelExecInfo 声明了以下内容:

SVM pointers must reference locations contained entirely within buffers that are passed to kernel as arguments, or that are passed through the execution information. Non-argument SVM buffers must be specified by passing pointers to those buffers via clSetKernelExecInfo for coarse-grain and fine- grain buffer SVM allocations but not for finegrain system SVM allocations.

关于pointers - Intel HD Graphics 是否违反了有关 SVM 的 OpenCL 规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72807280/

相关文章:

c++ - 在 OpenCL 代码中使用 clamp 函数

python - 是否有任何 python 机器学习库可以返回线性 svm 的系数或几何边距?

c++ - 初始化指向另一个结构内部结构的指针

c++ - C++ 类型 std::vector::size_type 在 OpenCL 中的等价物是什么?

c - c中的静态矩阵乘法到动态矩阵

opengl - 想法 : how to interactively render large image series using GPU-based direct volume rendering

machine-learning - SVM 加载的训练模型的准确度明显较低;我们还需要保存 TokenCountVectorizer 吗?

c++ - 二维点数据集中的 OpenCV 模板

pointers - 指向对象的类型变量 - Fortran

c++ - 通过两个类时出现奇怪的输出数据