我无法将 [Int32] 数组放入我的内核着色器中。
使用桥接标头,我可以得到一个结构数组,例如
typedef struct {
int ar[100];
} MyArray;
kernel void myShader(device MyArray *in [[buffer(0)]],
device MyArray *out [[buffer(1)]],
uint threadIndex [[thread_position_in_grid]])
然后使用 threadIndex 进行索引,我可以更改该数组并将其返回给 CPU,但是……
…Swift 看到的不是一个数组,而是:一个元组!
事实上,情况比这更糟。为了初始化我的输入,我还必须提供一个元组。 100 个元素!
由于我想使用大型数组,所以这是没有希望的。我不知道如何从数组构建一个元组,而初始化一个巨大元组的想法是……好吧,你可以想象。
相反,我尝试放弃桥接头并使用 Swift 结构并在着色器中将其重新定义为
struct MyArray {
var ar:[Int32]
}
和
typedef struct {
int ar[100];
} MyArray;
着色器不会抱怨,但如果我尝试更改数组中的索引,Swift 代码就会崩溃。比如说
out[threadIndex] = in[threadIndex]; // copy array
有效,但是
int index = 99-threadIndex;
out[index] = in[threadIndex]; // reverse array
crashes.
任何人都可以解释这一点或解释如何处理元组问题吗?
只需使用;
金属:
kernel void myShader(device const int *in [[buffer(0)]],
device int *out [[buffer(1)]],
uint threadIndex [[thread_position_in_grid]])
斯威夫特:
var ar_in:[Int32]
var ar_our:[Int32]