在R的OpenCL接口调用内核时如何使用__local内存参数
R调用带__local内存的OpenCL内核解决方案
__local参数的正确传参方式
R的OpenCL包处理局部内存时,不用传buffer或者NULL,直接给它指定总字节大小就行——OpenCL runtime会自动在设备上分配对应大小的局部内存。调整调用代码示例
你的内核有三个参数:__global numeric* output、const unsigned int count、__local numeric* tmp,调用时必须按顺序传全参数。假设tmp要存Size个双精度数值(R里的numeric对应OpenCL的double,每个占8字节),那局部内存大小就是Size * 8,代码改这样:
# 先分配输出buffer(内核要写输出,得提前弄好) output_buf <- as.clBuffer(rep(0, Size), Context) # 调用内核,按参数顺序传:输出buffer、count值、局部内存字节数 res <- as.numeric(oclRun( kernel = k.test, size = Size, output_buf, Size, Size * 8 # 这里传__local参数的字节大小 ))
关键注意点
- 内存大小要算准:如果内核里局部内存是按工作组维度分配(比如每个工作组用
get_local_size(0)个元素),那得先确定工作组大小,再算对应的字节数(比如local_size * 8)。 - 类型要匹配:如果内核里用
float代替numeric,那R里要对应用float类型(as.clBuffer时指定type="float"),内存大小改成Size * 4。 - 参数顺序不能错:必须和内核定义的参数顺序完全一致,不然会出现参数不匹配的错误。
- 内存大小要算准:如果内核里局部内存是按工作组维度分配(比如每个工作组用
排错技巧
要是还是报错,先用oclGetKernelArgInfo查看内核参数的类型和要求,确认每个参数的设置都符合规范。
内容的提问来源于stack exchange,提问作者lucEli
相关产品推荐
相关产品推荐

