【发布时间】:2016-12-04 18:56:57
【问题描述】:
我正在尝试为 Metal 中的 n 大小向量编写范数或平方长度函数。为此,我计划让每个线程平方每个元素,然后选择一个线程来汇总所有元素。
这是我当前的内核:
#include <metal_stdlib>
#include <metal_compute>
using namespace metal;
kernel void length_squared(const device float *x [[ buffer(0) ]],
device float *s [[ buffer(1) ]],
device float *out [[ buffer(2) ]],
uint gid [[ thread_position_in_grid ]],
uint numElements [[ threads_per_grid ]])
{
s[gid] = x[gid];// * x[gid];
simdgroup_barrier(mem_flags::mem_none);
if(gid == 0){
for(uint i = 0; i < numElements; i++){
*out += s[i];
}
}
}
不幸的是,此代码无法编译,因为“使用未声明的标识符simdgroup_barrier”。该方法记录在Metal Shading Language Specification 中。
有人遇到过吗?或者知道如何跨网格同步所有线程? threadgroup_barrier 没有实现完全同步。
我是否错误地处理了这个问题?同步此操作的最佳方法是什么?
【问题讨论】:
-
simdgroup_barrier目前仅适用于 iOS。
标签: multithreading macos synchronization gpgpu metal