我在OpenCL内核中使用 __ constant 限定符时遇到问题。我的平台是Snow Leopard。
我尝试在GPU上初始化一个CL只读内存对象,将我的常量数组从主机复制到它中。然后我像 __ global 内存参数一样设置内核参数,但是它不能正常工作,但我没有看到任何错误或警告。我也尝试直接在clSetKernelArg函数中使用数据,就像 float 和 int 类型一样,它既不起作用。
我是否犯了任何错误或Apple的实施有什么问题?我希望看到任何工作示例如何完成,包括OpenCL(gpu)和主机代码。
答案 0 :(得分:4)
我怀疑Apple的实施存在如此根本性的错误。我使用以下OpenCL Hello World Example应用程序来了解基础知识。
在此示例中,我将__global float* input
替换为__constant float* input
,并且工作正常。您还需要使用CL_MEM_READ_ONLY
等内容确保缓冲区为clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, NULL)
。
从阅读规范,我认为__constant => __global + CL_MEM_READ_ONLY。
我在MBP 15上运行Snow Leopard。
答案 1 :(得分:3)
Apple的OpenCL编译器在GPU上处理__constant
变量的方式存在一些缺陷。如果编译器日志说的是
OpenCL Build Error : Compiler build log:
Error while compiling the ptx module: CLH_ERROR_NO_BINARY_FOR_GPU
PTX Info log:
PTX Error log:
然后我遇到了和你一样的错误,并在其上提出了一个错误。 Apple的人们将其标记为副本(显然是rdar:// 7217974)所以我认为这是一个已知问题,他们正在研究它。
答案 2 :(得分:3)
“从阅读规范,我认为__constant => __global + CL_MEM_READ_ONLY。”
并非如此,当您指定_constant而不是__global时,您要对设备说明将此数据保存在内存的不同部分。在某些设备中,它可以是相同的,但其他设备不可能。例如,在NVIDIA显卡上,对于__global,你只有64kb的_constant内存和mb的加载量。 __constants的优点是在NVIDIA设备中,它被缓存:)
您可以查询您的设备:(我的设备查询示例)
CL_DEVICE_MAX_MEM_ALLOC_SIZE:128 MByte
CL_DEVICE_GLOBAL_MEM_SIZE:255 MByte
CL_DEVICE_LOCAL_MEM_SIZE:16 KByte
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:64 KByte