我有一台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);
遇到非法内存访问
现在我想知道,实际上我可以使用多少寄存器?它与块数有什么关系?
答案 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.