首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于不同的功能,每个块有不同的线程

对于不同的功能,每个块有不同的线程
EN

Stack Overflow用户
提问于 2013-02-05 10:40:06
回答 1查看 483关注 0票数 0

我编制了一个数据自动化系统程序,并陷入了一个问题。我有两个职能:

  1. __global__ void cal_freq_pl(float *, char *, char *, int *, int *)
  2. __global__ void cal_sum_vfreq_pl(float *, float *, char *, char *, int *)

我把第一个函数叫做:cal_freq_pl<<<M,512>>>( ... ); M是一个大约15的数字,所以我不担心它。512是我GPU上每个块的最大线程。这很好,并给出了所有M*512值的预期输出。

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

我目前只能访问Compute1.0ARCH,并在Windows64位计算机上拥有Nvidia FX4600显卡。

我不知道为什么会发生这种行为,我确信第一个函数运行于512个线程,第二个函数只运行384 (或更少)。

有人能提出一些可能的解决方案吗?

提前谢谢..。

编辑:下面是内核代码:

代码语言:javascript
复制
__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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-05 11:22:35

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

CUDA提供了一个工具来帮助计算每块线程的适当成员数。

calculator.xls

您还可以在CUDA安装dir中找到这个.xls文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14705545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档