Metal Shading Language spec中的文档如下:
mem_none
在这种情况下,没有应用内存栅栏,而threadgroup_barrier仅作为执行障碍。mem_threadgroup
确保为线程组中的线程正确排序内存操作到线程组内存。这是否意味着每当我们使用线程组内存时,我们需要使用mem_threadgroup
作为障碍?如果是这样,mem_none
在什么情况下就足够了?
我已经看到code加载了线程组内存,但是使用了mem_none
(这个代码是否存在?)。而另一个example使用了mem_threadgroup
。
答案 0 :(得分:1)
引用Apple开发者:
屏障中设置的memflags告诉编译器需要刷新哪些缓存,以便当yoru代码执行屏障时,所有线程都可以看到相同的内容。如果使用mem_none,则不会刷新缓存,并且未定义任何其他线程是否可以看到一个线程写入任何类型内存的值。如果设置mem_threadgroup,可以确保在屏障之后其他线程可以看到写入线程组内存(并且只有线程组内存)的任何值。
所以要回答你的问题,如果你的内核不依赖于从另一个线程写入线程组内存的值,你可以使用mem_none。但是如果您首先使用线程组内存,那么您可能(但不是给定)使用它来在线程之间进行通信,因此您可能希望设置mem_threadgroup。
答案 1 :(得分:0)
mem_threadgroup阻塞线程,直到对线程组内存的所有写入或读取访问都完成,而mem_none在不考虑内存访问的情况下阻塞线程。
据我了解,mem_threadgroup仅在您在线程组内存中工作时才有效。因此,如果您从线程组内存中读取一个变量并将其写回线程组内存中的另一个位置,那么屏障就会执行文档所说的内容。如果你有一个局部变量并将其写入线程组内存,则mem_threadgroup似乎与mem_none不同。
在示例1中,存在使用屏障的减少。我自己实现了这样的减少并尝试了mem_none和mem_threadgroup。两种方法都很好。如果您使用线程组内存,我仍然建议使用mem_threadgroup。我想这会带来一些性能优势。
答案 2 :(得分:0)
根据金属着色语言规范mem_threadgroup确保线程组内存访问操作的顺序。