swift 在Metal中Assert网格创建失败

qxsslcnc  于 2023-05-21  发布在  Swift
关注(0)|答案(1)|浏览(120)

我试图使用Metal API for Swift/C来调整text向量并行求和的示例代码,以便进行矩阵求和。此代码块管理网格和组的大小。矩阵A、B和Result为[rowsLength,colsLength]大,然后分布在rowsLengthcolsLengthsizeof(float)的1D GPU缓冲区上。我读了文档,但没有找到类似的代码。编译它,我得到错误:Assert失败`组件% 1:2必须<= 1为索引 thread_position_in_grid '上的最后一个命令分派线程,也有我发现只有1个问题回答,但这并没有帮助我理解这个问题。
在这一点上,我恳请澄清computeEncoder和这个错误。谢谢

- (void)encodeAddCommand:(id<MTLComputeCommandEncoder>)computeEncoder {

    // Encode the pipeline state object and its parameters.
    [computeEncoder setComputePipelineState:_mAddFunctionPSO];
    [computeEncoder setBuffer:_mBufferA offset:0 atIndex:0];
    [computeEncoder setBuffer:_mBufferB offset:0 atIndex:1];
    [computeEncoder setBuffer:_mBufferResult offset:0 atIndex:2];

    MTLSize gridSize = MTLSizeMake(rowsLength*colsLength, 1, 1);

    // Calculate a threadgroup size.
    NSUInteger threadGroupSize = _mAddFunctionPSO.maxTotalThreadsPerThreadgroup;
    if (threadGroupSize > rowsLength)
    {
        threadGroupSize = rowsLength;
    }
    MTLSize threadgroupSize = MTLSizeMake(threadGroupSize, threadGroupSize, 1);

    // Encode the compute command.
    [computeEncoder dispatchThreads:gridSize
              threadsPerThreadgroup:threadgroupSize];
}

我试图改变网格大小,把行放在第一个索引上,把列放在第二个索引上,同时改变线程组的大小。我想获得一个网格的R*C线程甚至1块。
编辑1我附上了一张照片,以进一步解释我试图获得什么,这两种情况下,程序给我同样的错误:Matrix, grid and block threading

k0pti3hp

k0pti3hp1#

dispatchThreads:threadsPerThreadgroup:采用网格大小和线程组大小。Assert告诉您的是,至少需要有一个线程组适合网格。
您的线程组Y轴大小为threadGroupSize,但您的线程网格Y轴大小仅为1。除非N等于1,并且N <= M,否则无法将NxN正方形放入Mx 1网格中。
我想获得一个网格的R*C线程甚至1块
如果你需要丢弃那些不符合你要求的线程,你需要在内核函数中添加early return,而不是依赖API来为你剔除线程。所以你的内核会把你实际需要的线程数作为一个[[buffer()]]参数,然后把[thread_position_in_grid]]和它进行比较,如果你不需要那个线程,就返回。

相关问题