【问题标题】:How to determine the thread-group and thread-size I should use for Metal vertex compute如何确定我应该用于 Metal 顶点计算的线程组和线程大小
【发布时间】:2018-06-07 15:24:37
【问题描述】:

我对 Metal 计算非常陌生,并且正在尝试围绕线程和组的概念来思考。问题是大多数(如果不是全部)示例都使用 2d 纹理作为示例,这完全不是我想要做的。我正在尝试创建一个计算函数,该函数在一个缓冲区中接收 2 个点和几个浮点数并计算 4 个点并将它们放入另一个缓冲区中,因此:

  |--------Buffer1------|      |-------Buffer2-----------|
f(point1, point2, [floats])=point1, point2, point3, point4
f is a function essentially involving some linear algebra with some multiplication 
and addition. The most costly part being a sqrt operation used to normalize 
the vector between point1 and point2. No branches in code. 

我大致知道如何编写内核函数,但我不知道如何为它分配线程和线程组,因为我不知道如何计算这种情况下可能的最佳数量。

【问题讨论】:

  • 大多数情况下,您不需要关心线程组。只需使用 Apple 在其Calculating Threadgroup and Grid Sizes 文章中显示的算法即可。对于您的情况,您需要处理一维缓冲区,只需将示例中的“texture.height”视为 1。

标签: objective-c swift xcode metal


【解决方案1】:

您可以根据需要分配线程和线程组,即以任何对您的逻辑最有意义的方式使用它们。

弄清楚线程和组的最佳数量是多少,可能需要反复试验。但一个好的起点是为每个要计算的独特事物使用一个线程。

在您的情况下,每个f(point1, point2, [floats]) 一个线程似乎是合理的(因此一个线程会将四个点写入输出缓冲区)。但是你对你的函数f() 并不是很具体,所以也许另一种分配线程的方法更有意义。我没有足够的信息来提出好的建议。

(注意:限制了您可以在单个组中使用的线程数。这取决于设备。因此,如果您需要更多线程,则必须将它们分开分成多个组。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2014-09-25
    • 2013-02-15
    • 2014-08-12
    • 2010-09-15
    相关资源
    最近更新 更多