像变量一样存储在内核中的小数组?
Small array stored like variables in a kernel?
在我的 OpenCL 内核中,我需要使用通常应该是 4 个条目的小数组,但由于我担心该数组将如何存储(可能在比常规变量慢得多的内存中)我我改为使用 4 个单独的变量和一个 switch-case 语句来根据索引访问正确的变量。
有没有办法让一个 4 x float4 的小数组像 4 个独立的 float4 变量一样快速无缝地工作?
这是我正在尝试做的事情:我的内核旨在通过遍历要应用于 v
的操作列表来生成单个 float4 变量 v
。它按顺序运行,列表中的操作一个接一个地应用于 v
,但是在该列表中可以有某种 brackets/parentheses,就像在算术中隔离一组要完成的操作一样在该支架与其余支架一起返回之前处于隔离状态。
因此,如果括号被打开,那么我应该暂时将 v
的值存储到 v0
中(表示括号深度为 0 的当前值),然后 v
可以重置为 0 并在括号内执行操作,如果该括号内还有另一个括号,我会将 v
放入 v1
等等 v2
和v3
随着我们深入嵌套括号。这样一来,我就可以在括号内应用乘法,它只会影响在该括号内创建的其他内容,而不会影响其余内容。
一旦括号关闭,我将检索例如v3
并向其添加 v
,最后所有括号将关闭并且 v
将代表一系列操作的最终期望值并写入全局缓冲区。根据当前括号深度,使用 switch-case 语句 select 正确的变量是可行的,但这是非常荒谬的,因为这就是数组的用途。所以我不确定最好的办法是什么。
据我所知,编译器通常会将 private
地址 space 中声明的小数组直接放入寄存器中。当然,这不是保证,可能有不同的参数干预该优化的激活,例如:
- 数组大小;
- 注册压力;
- 溢出的成本;
- 还有其他人。
与优化一样,唯一可以确定的方法是通过检查生成的程序集来验证编译器在做什么。
So if a bracket is being opened then I should temporarily store the value of v into let's say v0 (to represent the current value at the bracket depth of 0), then v can be reset to 0 and perform the operations inside the bracket, and if there's yet another bracket inside that bracket I'd put v into v1 and so on with v2 and v3 as we go deeper into nested brackets. This is so that I can for instance apply a multiplication inside a bracket that would only affect the other things created inside that bracket and not the rest.
我认为这不会有帮助。无论如何,编译器都会跨范围进行优化。只做简单的事情,让优化器完成它的工作。 然后,如果您注意到代码生成不是最理想的,您可能会开始考虑替代解决方案,但之前不会。
在我的 OpenCL 内核中,我需要使用通常应该是 4 个条目的小数组,但由于我担心该数组将如何存储(可能在比常规变量慢得多的内存中)我我改为使用 4 个单独的变量和一个 switch-case 语句来根据索引访问正确的变量。
有没有办法让一个 4 x float4 的小数组像 4 个独立的 float4 变量一样快速无缝地工作?
这是我正在尝试做的事情:我的内核旨在通过遍历要应用于 v
的操作列表来生成单个 float4 变量 v
。它按顺序运行,列表中的操作一个接一个地应用于 v
,但是在该列表中可以有某种 brackets/parentheses,就像在算术中隔离一组要完成的操作一样在该支架与其余支架一起返回之前处于隔离状态。
因此,如果括号被打开,那么我应该暂时将 v
的值存储到 v0
中(表示括号深度为 0 的当前值),然后 v
可以重置为 0 并在括号内执行操作,如果该括号内还有另一个括号,我会将 v
放入 v1
等等 v2
和v3
随着我们深入嵌套括号。这样一来,我就可以在括号内应用乘法,它只会影响在该括号内创建的其他内容,而不会影响其余内容。
一旦括号关闭,我将检索例如v3
并向其添加 v
,最后所有括号将关闭并且 v
将代表一系列操作的最终期望值并写入全局缓冲区。根据当前括号深度,使用 switch-case 语句 select 正确的变量是可行的,但这是非常荒谬的,因为这就是数组的用途。所以我不确定最好的办法是什么。
据我所知,编译器通常会将 private
地址 space 中声明的小数组直接放入寄存器中。当然,这不是保证,可能有不同的参数干预该优化的激活,例如:
- 数组大小;
- 注册压力;
- 溢出的成本;
- 还有其他人。
与优化一样,唯一可以确定的方法是通过检查生成的程序集来验证编译器在做什么。
So if a bracket is being opened then I should temporarily store the value of v into let's say v0 (to represent the current value at the bracket depth of 0), then v can be reset to 0 and perform the operations inside the bracket, and if there's yet another bracket inside that bracket I'd put v into v1 and so on with v2 and v3 as we go deeper into nested brackets. This is so that I can for instance apply a multiplication inside a bracket that would only affect the other things created inside that bracket and not the rest.
我认为这不会有帮助。无论如何,编译器都会跨范围进行优化。只做简单的事情,让优化器完成它的工作。 然后,如果您注意到代码生成不是最理想的,您可能会开始考虑替代解决方案,但之前不会。