Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA CC 5.0中的寄存器数是多少?_Cuda_Gpu - Fatal编程技术网

CUDA CC 5.0中的寄存器数是多少?

CUDA CC 5.0中的寄存器数是多少?,cuda,gpu,Cuda,Gpu,我有一个GeForce GTX 745(CC 5.0) deviceQuery命令显示每个块可用的寄存器总数为65536(65536*4/1024=256KB) 我编写了一个内核,它使用大小为10K的数组,内核调用如下。我尝试了两种分配数组的方法 // using registers fun1() { short *arr = new short[100*100]; // 100*100*sizeof(short)=256K / per block .... delet

我有一个GeForce GTX 745(CC 5.0)

deviceQuery命令显示每个块可用的寄存器总数为65536(65536*4/1024=256KB)

我编写了一个内核,它使用大小为10K的数组,内核调用如下。我尝试了两种分配数组的方法

// using registers
fun1() {
    short *arr = new short[100*100];  // 100*100*sizeof(short)=256K / per block
    ....
    delete[] arr;
}
fun1<<<4, 64>>>();

// using global memory
fun2(short *d_arr) {
    ...
}
fun2<<<4, 64>>>(d_arr);
//使用寄存器
fun1(){
short*arr=new short[100*100];//100*100*sizeof(short)=256K/每个块
....
删除[]arr;
}
fun1();
//使用全局内存
fun2(短*d_arr){
...
}
fun2(d_arr);
在这两种情况下我都能得到正确的结果。 第一个使用寄存器的运行速度要快得多

但是当使用6个块调用内核时,我得到了错误代码77

fun1<<<6, 64>>>();
fun1();
遇到非法内存访问


现在我想知道,实际上我可以使用多少寄存器?它与街区的数量有什么关系

您问题中的一个重要误解是,新操作员以某种方式使用寄存器来存储在设备上运行时分配的内存。事实并非如此。寄存器仅由编译器静态分配。新操作员使用专用堆进行设备分配

详细说明:在您的代码中,
fun1
,第一行由所有线程调用,因此每个块的每个线程将分配10000个16位值,即每个块1280000字节。对于4个块,其大小为5120000字节,对于6个块,其大小为7680000字节,由于某种原因,似乎超出了预分配的限制(默认限制为8MB-请参阅)。这可能就是为什么会出现这种非法访问错误(77)

使用new将像malloc一样使用一些预先分配的全局内存,但不使用寄存器-可能您提供的代码与您运行的代码不完全相同。如果需要寄存器,则需要在固定数组中定义数据:

func1() 
{
   short arr [100] ;
   ...
}

然后,编译器将尝试将数组放入寄存器中。但是请注意,此寄存器数据是每个线程的,并且设备上每个线程的最大32位寄存器数为255。

这可能与寄存器数无关,但与代码中的错误有关。如果您想要调试方面的帮助,请发布完整的可构建代码。检查所有API调用和所有内核启动的返回状态时会发生什么情况?@njuffa in fun1()我为数组分配了256KB,这将超过每个块的寄存器限制。它为什么工作?像
arr
这样的动态分配数组不存储在寄存器中。