register申请数组

请问能为每个thread在register上申请一维数组吗?一共8个变量,方便管理
我的显卡是C2050

LZ您好,您可以在kernel里面定义一个数组,这样每个线程就拥有这样一个数组。

但是,如果在编译的时候无法确定下标,因为寄存器是无妨寻址的,那么该数组将会被放在local memory上,造成速度下降。当然,如果在在编译的时候能确认所有下标,那么会使用寄存器。

以及,如果您不确定到底如何,可以先写成数组,编译后用NVVP跑一下,即可看到local memory的使用量,以便判断您的数组是跑在寄存器上还是跑在local memory上。

大致如此,您不妨一试。

祝您好运!

版主,我还不是很清楚。。。
我想知道在kernel中定义:double a[8]
这a[8]是定义在register上的吗?还是放在local memory里的?

“编译的时候无法确定下标”什么意思?能举个例子吗?不好意思我是新手,麻烦版主了

LZ您好,您单纯在kernel里面定义一个数组,只能保证该数组是每个线程私有的,如同2#第一段所说。

这类没有其他附加修饰的变量/数组,有时也称为auto变量,将由编译器决定放在哪里。一般来说编译器都是尽量放在速度快的寄存器里面,但是因为NV GPU的寄存器是不支持寻址的,所以如果在编译的时候编译器无法确定下标,(比如下标的值在运行的时候才会作为参数传入),那么编译器将会将此数组放在支持寻址的local memory里面。正如2#第二段所说。
所以无法回答您单纯定义一个数组的时候,该数组在寄存器中还是在local memory里面。

以及,您可以自己分析代码以确定该数组的保存地点。
或者使用NVVP跑一下您的程序,看看local memory的占用。如果没占用,那么必然是使用了寄存器。这也是一个简单的方法。如同2#第三段所说的那样。

大致如此,请LZ参考。

祝您好运~

3q so much!

tdchenhao的理解是错误的。

(1)tdchenhao点评ICE的文章道:
“double x[n];n不是宏,也不是常量,而是变量时,n就是不确定的下标”
–这个违背了ICE的原意,这并不是不确定的下标。而是不定长数组,并且在当前版本的toolkit下,不被支持,无法同过编译。

(2)tdchenhao点评ICE的文章道:
“double x[8];这里8就是确定的下标”
—同上条,这个只是确定长度的数组。而不是ICE说的“确定的下标”。

因为tdchaohao的2条对ICE的点评和ICE的文章均不符合,
请楼主无视tdchenhao.