自动数组变量的大小

《大规模并行处理器编程实战》中第68页提到,每个线程 为每一个自动数组变量创建一个私有版本并使用它,一般支持多大的自动数组变量?

这个难说,要看该“数组”在同一个时刻的最大需要的存活元素数量。

极端的说,数组最多能用的大小是线程能用的寄存器数量*4B + 线程能用的local memory最大数量。
(在fermi上,这个是63B * 4 + 512KB = 524540字节的数组)

如果编译器发现数组的访问有规律,同时存在在有效期的元素数目是有限的,且少于上段中的字节数,那么你几乎可以使用无限大小的数组,例如这个例子:
int dog[100000000];
for (int i = 2; i < 1000000; i++)
{
dog[i] = …; //从显存读取
dog[i] = dog[i] * dog[i - 1] + dog[i - 2];
… = dog[i]; //写入结果
}

那么你将几乎可以使用无限大的数组,因为同时存活的元素只有3个。

能用的数组数量很大,不过要知道,如果数组太大(比如超过30个int)那么将很有可能这些数组被存储到慢的显存而不是快速的寄存器中。,所以申请大数组的时候要考虑速度。

假设我需要创建200000个线程,每个线程处理过程中需要创建float temp[4000]的临时数组,应该怎么操作?

LZ您好:

1:请您在启动kernel的时候的<<<>>>中指定合适的形状参数,即可发布200000个线程。

2:请您在kernel内部直接定义您的临时数组即可,按照您的申请规模,单线程在16KB存储空间不到,是可以顺利申请的。

祝您好运~