在我的 OpenCL 内核中,我需要使用通常应该是 4 个条目的小数组,但由于我担心该数组的存储方式(可能比常规变量慢得多的内存中),我改用 4 个单独的变量和一个 switch-case 语句来访问基于索引的正确变量。
有没有办法让一个 4 x float4 的小数组像 4 个单独的 float4 变量一样快速无缝地工作?
这就是我要做的:我的内核旨在通过一系列操作来生成单个 float4 变量v
以应用于v
。它按顺序运行,列表中的操作被应用于v
,但是在该列表中可以有某种括号/括号,就像在算术中隔离一组操作一样,在将该括号的结果与其余部分一起带回之前,将它们隔离完成。
因此,如果打开了一个括号,那么我应该暂时将 v
的值存储到 v0
中(以表示括号深度为 0 的当前值),然后v
可以重置为 0 并在括号内执行操作,如果该括号内还有另一个括号,我会v
放入v1
中,依此类推,v2
和v3
,因为我们深入到嵌套括号。例如,这样我就可以在括号内应用乘法,这只会影响在该括号内创建的其他内容,而不会影响其余内容。
一旦括号关闭,我会检索例如 v3
并向其添加v
,最后所有括号将关闭,v
表示一系列操作的最终所需值,并写入全局缓冲区。这是可行的,使用 switch-case 语句根据当前括号深度选择正确的变量,但这非常荒谬,因为这就是数组的用途。所以我不确定最好的办法是什么。
据我所知,编译器通常会将private
地址空间中声明的小数组直接放在寄存器中。当然,这不是保证,可能有不同的参数会干预该优化的激活,例如:
- 阵列大小;
- 记录压力;
- 溢出成本;
- 等。
与通常的优化一样,确定的唯一方法是通过检查生成的程序集来验证编译器正在执行的操作。
因此,如果打开了一个括号,那么我应该暂时将 v 的值存储到 v0 中(以表示括号深度为 0 的当前值),然后 v 可以重置为 0 并在括号内执行操作,如果该括号内还有另一个括号,我会将 v 放入 v1 中,依此类推,随着我们深入嵌套括号。例如,这样我就可以在括号内应用乘法,这只会影响在该括号内创建的其他内容,而不会影响其余内容。
我认为这无济于事。无论如何,编译器都会跨范围进行优化。只需做简单的事情,让优化器完成它的工作。然后,如果您发现次优代码生成,您可能会开始考虑替代解决方案,但在此之前不会。