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

时间:2016-04-07 14:57:15

标签: cuda gpu

我有一台GeForce GTX 745(CC 5.0)。

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

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

 <?php if (isset($records)) : foreach ($records as $row) : ?>

    <div id="mobile-content">
                    <table class="table table-hover">
                        <thead>
                        <tr>
                            <th>Account Name</th>
                            <th>Balance</th>
                            <th>Start Date</th>
                        </tr>
                        </thead>

                        <tbody>
                        <tr>
                            <td><?php echo $row->bank_name; ?></td>
                        </tr>
                        <tr>
                            <td><?php echo $row->bank_balance; ?></td>
                        </tr>
                        <tr>
                            <td><?php echo $row->bank_start_date; ?></td>
                        </tr>
                        </tbody>
                    </table>
                </div>
            <?php endforeach; ?>

在这两种情况下我都能得到正确的结果。 使用寄存器的第一个运行速度要快得多。

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

// 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);
  

遇到非法内存访问

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

1 个答案:

答案 0 :(得分:-1)

在你的代码fun1中,第一行由所有线程调用,因此每个块的每个线程将分配10,000个16位值,即每个块1,280,000个字节。 4个块,5,120,000个字节,6个7,780,000个字节由于某种原因似乎溢出预分配限制(默认限制为8MB - 见Heap memory allocation)。这可能是您收到此非法访问错误(77)的原因。

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

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

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