【问题标题】:How to pass dynamic sized super large array to Metal Argument buffers?如何将动态大小的超大数组传递给 Metal Argument 缓冲区?
【发布时间】:2021-08-07 23:39:24
【问题描述】:

我有一个包含超过 100 万个结构实例的大型数组。大小实际上是动态的。 它适用于MTLBuffer,它似乎是金属着色器中的一个指针,我不必编写一些硬编码的大小或长度。

问题是,我不想为每一帧绑定或设置它。所以,我正在调查ArgumentBuffersHeap。但是我没有为我的用例找到解决方案或示例。看起来 ArgumentBuffers 中数组中的所有内容都将占用一些插槽。这对我的大型阵列来说不是一个好主意。而且我没有找到在 ArgumentBuffers 中有指针的好例子。

毕竟,我的用例的最佳实践是什么?

【问题讨论】:

  • 有点不清楚您在问什么或问题出在哪里。您是否尝试将大数组作为参数缓冲区中的单个缓冲区传递?或者您是否希望结构的每个实例成为参数缓冲区中的单独字段?你想节省内存或时间或两者兼而有之?代码示例/sn-p 在这里会有所帮助。
  • @Itai 嗨,我需要数组在使用参数缓冲区时仍然作为单个缓冲区工作。目的是减少 [.... setBuffer ... offset ... atIndex ...] 的代码,在渲染循环中使用更少的代码。
  • 我的意思是,与任何数组一样,您需要一个指向数组开头的指针和许多元素。您可以创建一个具有此指针和元素数量的单个参数缓冲区并仅绑定它。然后使用MTLArgumentEncoder 填充它。之后,您只需要通过调用useResource来标记间接使用的缓冲区(意味着它在AB中编码,但未使用)。

标签: gpgpu metal mtlbuffer


【解决方案1】:

让我回答我自己的问题。支持参数缓冲区内的动态大小数组。我们需要支持Metal 2 Tier 2的设备。

[argumentEncoder setArgumentBuffer:_argumentBuffer startOffset:0 arrayElement:0];
// Then, write some code to fill the data for first element
[argumentEncoder setArgumentBuffer:_argumentBuffer startOffset:0 arrayElement:1];
// Then, write some code to fill the data for second element

而在 GPU 方面,您可以简单地使用下面的指针引用。

constant TheBufferTypeName* theBuffer [[buffer(0)]]

然后,将其与theBuffer[0]theBuffer[1] 一起使用。

它没有任何硬编码的大小。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2016-02-06
    • 2015-08-13
    • 2013-06-14
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多