Opencl 像内核中的变量一样存储的小数组?

Opencl 像内核中的变量一样存储的小数组?,opencl,Opencl,在我的OpenCL内核中,我需要使用通常应该是一个由4个条目组成的小数组,但由于我担心该数组将如何存储(可能存储在比常规变量慢得多的内存中),因此我使用4个单独的变量和一个switch case语句来访问基于索引的正确数组 有没有一种方法可以让一个4 x float4的小数组像4个独立的float4变量一样快速无缝地工作 下面是我要做的:我的内核通过遍历要应用于v的操作列表来生成单个float4变量v。它按顺序运行,列表中的一个接一个操作应用于v,但是在该列表中可以有一些括号/括号,它们就像在算

在我的OpenCL内核中,我需要使用通常应该是一个由4个条目组成的小数组,但由于我担心该数组将如何存储(可能存储在比常规变量慢得多的内存中),因此我使用4个单独的变量和一个switch case语句来访问基于索引的正确数组

有没有一种方法可以让一个4 x float4的小数组像4个独立的float4变量一样快速无缝地工作

下面是我要做的:我的内核通过遍历要应用于
v
的操作列表来生成单个float4变量
v
。它按顺序运行,列表中的一个接一个操作应用于
v
,但是在该列表中可以有一些括号/括号,它们就像在算术中一样,在将括号和其余括号的结果带回来之前,隔离一组要单独完成的操作

因此,如果一个支架被打开,那么我应该临时将
v
的值存储到
v0
(表示支架深度0处的当前值),然后
v
可以重置为0并在支架内执行操作,如果在这个括号内还有另一个括号,我会把
v
放进
v1
中,然后再把
v2
v3
放进嵌套的括号中。例如,我可以在一个括号内应用乘法,它只会影响该括号内创建的其他内容,而不会影响其余内容


一旦括号关闭,我将检索例如
v3
并向其添加
v
,最后所有括号都将关闭,
v
将表示一系列操作的最终期望值并写入全局缓冲区。使用switch-case语句根据当前的括号深度选择正确的变量是可行的,但这非常荒谬,因为这就是数组的用途。因此,我不确定最好的做法是什么。

从我所看到的情况来看,编译器通常会将声明在
私有
地址空间中的小数组直接放在寄存器中。当然,这不是一个保证,可能有不同的参数介入优化的激活,例如:

  • 数组大小
  • 记录压力
  • 溢出成本
  • 等等
与通常的优化一样,确保的唯一方法是通过检查生成的程序集来验证编译器正在做什么

因此,如果一个支架被打开,那么我应该暂时将v的值存储到v0中(表示支架深度为0时的当前值),然后v可以重置为0,并在支架内执行操作,如果在这个括号内还有另一个括号,我会把v放在v1中,然后再加上v2和v3,我们再深入到嵌套括号中。例如,我可以在一个括号内应用乘法,它只会影响该括号内创建的其他内容,而不会影响其余内容


我认为那没用。无论如何,编译器都会跨作用域进行优化。只需做简单的事情,让优化器完成它的工作。然后,如果您注意到次优的codegen,您可能会开始考虑替代解决方案,但不是在此之前。

从我所看到的,编译器通常会将声明在
专用
地址空间中的小数组直接放在寄存器中。当然,这不是一个保证,可能有不同的参数介入优化的激活,例如:

  • 数组大小
  • 记录压力
  • 溢出成本
  • 等等
与通常的优化一样,确保的唯一方法是通过检查生成的程序集来验证编译器正在做什么

因此,如果一个支架被打开,那么我应该暂时将v的值存储到v0中(表示支架深度为0时的当前值),然后v可以重置为0,并在支架内执行操作,如果在这个括号内还有另一个括号,我会把v放在v1中,然后再加上v2和v3,我们再深入到嵌套括号中。例如,我可以在一个括号内应用乘法,它只会影响该括号内创建的其他内容,而不会影响其余内容


我认为那没用。无论如何,编译器都会跨作用域进行优化。只需做简单的事情,让优化器完成它的工作。然后,如果您注意到不理想的代码生成,您可能会开始考虑替代解决方案,但不是在此之前。

哦,很高兴知道。那应该是什么样的数组呢?二等兵?太好了,我试试看,谢谢!哦,很高兴知道。那应该是什么样的数组呢?二等兵?太好了,我试试看,谢谢!