gpt4 book ai didi

arrays - Metal 中的数组结构

转载 作者:可可西里 更新时间:2023-11-01 02:03:26 25 4
gpt4 key购买 nike

我的目标是快速创建一个包含数组的结构,我可以将其打包到 Metal 缓冲区中以在内核函数中使用。

像这样:

struct StructA  {
var listA: [StructB] = [StructB](repeating: StructB(), count: 100)
var listB: [StructC] = [StructC](repeating: StructC(), count: 100)
var primitiveA: Int = 0
var primitiveB: Int = 0
}

我不太确定如何解决这个问题。上面的示例显然不起作用,因为数组实际上不在 StructA 中。我的猜测是必须有一种方法可以在结构内创建数组,以便使用的内存在结构内物理对齐。

目前我的解决方法是将 listA 和 listB 打包到两个单独的缓冲区中,将它们设置为我的内核函数的参数,并在内核函数中将它们分配给在每个线程中创建的 StructA,这是一个疯狂的冗余。

kernel void functionA(
const device StructB *listA [[buffer(0)]],
const device StructC *listB [[buffer(1)]],
device int &primitiveA [[buffer(2)]],
device int &primitiveB [[buffer(3)]],
) {
StructA structA = StructA(); //create a struct in each and every thread
structA.listA = listA; //and assign the same lists to the struct
structA.listB = listB; //that is the same in every thread
structA.primitiveA = primitiveA;
structA.primitiveB = primitiveB;

//do stuff with structA
}

这个例子可能不是完美无缺,但我认为问题描述的很充分。我希望有一个解决方案。如果不是通过创建可承受的结构,我还会使用任何其他解决冗余的解决方案。

最佳答案

这样做需要在堆栈上分配数组 listA 和 listB,目前这是不可能的,因为数组没有固定大小,因此分配在堆上。

要解决这个问题,您可以使用元组代替数组,或者在 C 代码中声明您的结构。您甚至可以通过将结构声明放入 C 头文件中来与您的 Metal 代码共享结构声明。

This answer可能对你有帮助。

关于arrays - Metal 中的数组结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44745935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com