CUDA每个块的不同线程用于不同的功能

时间:2013-02-05 10:40:07

标签: cuda

我制作了一个CUDA程序并遇到了问题。我有两个功能:

  1. __global__ void cal_freq_pl(float *, char *, char *, int *, int *)
  2. __global__ void cal_sum_vfreq_pl(float *, float *, char *, char *, int *)
  3. 我像这样调用第一个函数:     cal_freq_pl<<<M,512>>>( ... ); M是一个大约15的数字,所以我并不担心。 512是我GPU上每个块的最大线程数。这样可以正常工作,并为所有M * 512值提供预期输出。

    但是当我以类似的方式调用第二个函数时:     cal_sum_vfreq_pl<<<M,512>>>( ... ); 这是行不通的。在调试了该函数的废话之后,我终于发现它以这些维度运行:cal_sum_vfreq_pl<<<M,384>>>( ... );,这比128小于128.它显示512没有错误,但结果不正确。

    我目前只能访问Compute1.0 arch并在Windows 64位计算机上安装Nvidia Quadro FX4600显卡。

    我不知道为什么会发生这样的行为,我确信第一个函数是针对512个线程运行而第二个函数运行的是384个(或更少)。

    有人可以建议一些可能的解决方案吗?

    提前致谢...

    编辑: 这是内核代码:

    __global__ void cal_sum_vfreq_pl(float *freq, float *v_freq_vectors, char *wstrings, char *vstrings, int *k){
        int index = threadIdx.x;
        int m = blockIdx.x;
        int block_dim = blockDim.x;
        int kv = *k; int vv = kv-1; int wv = kv-2;
        int woffset = index*wv;
        int no_vstrings = pow_pl(4, vv);
        float temppp=0;
        char wI[20], Iw[20]; int Iwi, wIi;
        for(int i=0;i<wv;i++) Iw[i+1] = wI[i] = wstrings[woffset + i];
        for(int l=0;l<4;l++){
                Iw[0] = get_nucleotide_pl(l);
                wI[vv-1] = get_nucleotide_pl(l);
                Iwi = binary_search_pl(vstrings, Iw, vv);
                wIi = binary_search_pl(vstrings, wI, vv);
                temppp = temppp + v_freq_vectors[m*no_vstrings + Iwi] + v_freq_vectors[m*no_vstrings + wIi];
        }
        freq[index + m*block_dim] = 0.5*temppp;
    }
    

1 个答案:

答案 0 :(得分:1)

似乎你在第二个内核中分配了很多寄存器。由于硬件资源限制(例如每个块的寄存器编号),您无法始终达到每个块的最大线程数。

CUDA提供了一个工具来帮助计算每个块的正确线程数。

http://developer.download.nvidia.com/compute/cuda/CUDA_Occupancy_calculator.xls

您也可以在CUDA安装目录中找到此.xls文件。