我试图使用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
1条答案
按热度按时间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]]
和它进行比较,如果你不需要那个线程,就返回。