2

我在我的 OpenCL 内核中使用__constant限定符时遇到问题。我的平台是雪豹。

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

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

4

3 回答 3

4

我怀疑苹果的实施存在一些根本性的错误。我使用以下OpenCL Hello World 示例应用程序来了解基础知识。

在这个例子中,我替换了__global float* inputwith__constant float* input并且效果很好。您还需要确保您的缓冲区CL_MEM_READ_ONLYclCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, NULL).

通过阅读规范,我认为 __constant => __global + CL_MEM_READ_ONLY。

我在 MBP 15" 上运行 Snow Leopard。

于 2009-10-22T22:35:20.380 回答
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),所以我认为这是一个已知问题,他们正在解决这个问题。

于 2009-10-28T08:23:58.027 回答
3

“通过阅读规范,我认为 __constant => __global + CL_MEM_READ_ONLY。”

并非如此,当您指定 _constant 而不是 __global 时,您是在告诉您的设备将此数据保存在内存的不同部分。在某些设备中,确实可以相同,但其他设备则不能。例如,在 NVIDIA 卡上,您只有 64kb 的 _constant 内存和 __global 的 mb 负载。__constants 的优点是在 NVIDIA 设备中,它被缓存了:)

您可以查询您的设备:(我的设备查询示例)

CL_DEVICE_MAX_MEM_ALLOC_SIZE:128 MB

CL_DEVICE_GLOBAL_MEM_SIZE:255 MB

CL_DEVICE_LOCAL_MEM_SIZE:16 KB

CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:64 KB

于 2010-05-21T14:43:06.143 回答