计算Cuda内核中的寄存器/线程

时间:2013-07-28 22:32:49

标签: cuda gpu cpu-registers hpc

nSight探查器告诉我,以下内核每个线程使用52个寄存器:

 //Just the first lines of the kernel.
__global__ void voles_kernel(float *params, int *ctrl_params, 
                             float dt, float currTime,
                             float *dev_voles, float *dev_weasels, 
                             curandStateMtgp32 *state) 
{

 __shared__ float dev_params[9];

 __shared__ int BuYeSimStep[4];

 if(threadIdx.x < 4)
 {
   BuYeSimStep[threadIdx.x] = ctrl_params[threadIdx.x];
 }

 if(threadIdx.x < 9){
     dev_params[threadIdx.x] = params[threadIdx.x];
 }

 __syncthreads();

float currVole = curand_uniform(&state[blockIdx.x]) + 3.0;
float currWeas = curand_uniform(&state[blockIdx.x]) + 0.1;
float oldVole = currVole;
float oldWeas = currWeas;

int jj;

if (blockIdx.x * blockDim.x + threadIdx.x < BuYeSimStep[2])
{
int dayIndex = 0;

/* Not declaring any new variable from here on, just doing arithmetics.
   ....... */

如果每个寄存器有4个字节,我甚至不理解我们如何获得52个寄存器 假设数组params [9]和ctrl_params [4]最终在寄存器中(其中 我使用共享内存的情况没有意义)。我会 喜欢增加占用率,但我不明白我为什么要使用这么多寄存器。 有什么想法吗?

3 个答案:

答案 0 :(得分:7)

通常很难查看C代码并从中预测寄存器的使用情况。编译器可以通过增加寄存器使用来积极地优化代码,可能在这里或那里保存指令。您似乎在假设可以从C代码变量分配中预测寄存器使用情况,并且虽然两者之间存在某种连接,但您不能假设寄存器使用可以直接从C代码变量分配计算。

由于您尚未提供代码,因此没有人能真正帮助您使用注册表。如果您想更好地理解寄存器的使用,您需要直接查看PTX代码。为此,使用带有nvcc开关的-ptx编译代码,并直接检查生成的.ptx文件。为此,您可能希望参考PTX documentation以及nvcc documentation来查看各种编译器选项。

您尚未提供代码,因此无法提出任何直接建议,但您可以通过减少常量使用,减少或重构算术使用来减少寄存器使用,从double切换到float,我相信还有很多其他建议。如果将-G开关传递给编译器,则注册用法也会受到影响。

您可以通过将-maxrregcount开关传递给nvcc并使用适当的参数来限制编译器对每个线程的寄存器的使用,例如-maxrregcount 20将指示编译器将自己限制为20每个线程注册。但是,这种策略可能无法产生良好的效果,或者您可能需要将参数调整为不会牺牲太多性能的值。然而,您可能会找到一个最佳选择,它不会牺牲太多的基本性能,但可以让您提高入住率。如果你过多地限制编译器,它将开始将它所需的寄存器使用量溢出到本地存储器,这通常会降低性能。

您还应该知道,您可以将-Xptxas -v传递给nvcc,这将在编译时提供有关编译器的寄存器用法和其他相关数据(溢出等)的有用输出。

答案 1 :(得分:1)

如果你想增加占用率,直接的方法是使用编译器标志:maxregcount来限制寄存器的使用,但是它可能会因性能损失而丢失,因为有些寄存器会溢出到本地存储器,这非常慢。

答案 2 :(得分:1)

我建议您使用Eclipse Nsight调试代码。 在内核的第一行创建一个断点并逐步执行。 在Debug Perspective中,在CUDA Thread内部,您具有当前堆栈跟踪。右键单击堆栈,然后单击&#34;指令步进模式&#34;。窗口&#34;反汇编&#34;将打开你的内核PTX程序集。您可以继续单步执行内核以跟踪源代码与程序集的关联。因此,您可以发现使用哪个寄存器。