我正在使用 Apple 的Metal编写一个计算函数(又名内核)来进行科学计算。
在内核中,我使用线程组内存空间。(据我了解,它类似于OpenCL 中的本地内存空间 - 如果我错了,请纠正我。)为了同步一些内存读/写操作,我需要放置 threadgroup_barrier(mem_threadgroup)。但是,屏障命令不断产生错误:
Use of undeclared identifier 'mem_threadgroup.'
即使我删除了函数调用 (threadgroup_barrier()) 的参数,我也会收到错误消息:
No matching function for call to 'threadgroup_barrier' in the kernel.
我在内核中包含了头文件“metal_stdlib”。我在这里想念什么?我需要使用另一个标题来使用屏障吗?
任何建议将被认真考虑。
这是代码摘要:
#include <metal_stdlib>
using namespace metal;
kernel void myKernel(device float2 *args [[buffer(0)]],
uint2 bidx [[threadgroup_position_in_grid]],
uint2 tidx [[thread_position_in_threadgroup]])
{
// memory space shared by thread groups
threadgroup float2 tile[32][32+1];
...
for (uint k = 0; k < params.depth; k++)
{
... // operations with tile (threadgroup memory space)
threadgroup_barrier(mem_threadgroup);
... // more operations with tile
threadgroup_barrier(mem_threadgroup);
}
}