在OpenCL内核中使用常量限定符

时间:2009-10-16 08:38:41

标签: osx-snow-leopard opencl

我在OpenCL内核中使用 __ constant 限定符时遇到问题。我的平台是Snow Leopard。

我尝试在GPU上初始化一个CL只读内存对象,将我的常量数组从主机复制到它中。然后我像 __ global 内存参数一样设置内核参数,但是它不能正常工作,但我没有看到任何错误或警告。我也尝试直接在clSetKernelArg函数中使用数据,就像 float int 类型一样,它既不起作用。

我是否犯了任何错误或Apple的实施有什么问题?我希望看到任何工作示例如何完成,包括OpenCL(gpu)和主机代码。

3 个答案:

答案 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