我正在尝试在数组数组上运行金属计算着色器。我认为因为我们使用指针来为着色器提供数组,所以逻辑解决方案是在处理 2D 数组时使用双指针。
我的核函数形式为:
kernel void foo(device float** array2D [[buffer(0)]], uint2 pid [[thread_position_in_grid]]) {
...
}
当我device float** array2D [[buffer(0)]]
在 Metal 着色器函数中用作参数时,出现错误:
缓冲区指针类型“设备浮点 *”的地址空间限定无效
我假设这是因为编译器将其解释device float *
为地址空间限定(无效)。我的问题是:如何告诉编译器我正在使用双指针?如果由于某种原因我不能使用双指针,那么处理二维数组有什么好的解决方法?
旁注:我知道可以将所有数组中的元素组合成一个数组,对单个数组进行计算,然后将数组分成更小的数组。但是,这确实效率低下并且需要很长时间。(我正在使用大型阵列,因此使用金属)。