【发布时间】:2023-03-20 21:17:01
【问题描述】:
我正在编写一个 CUDA 程序,但遇到了一个问题。我有两个功能:
__global__ void cal_freq_pl(float *, char *, char *, int *, int *)__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.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;
}
【问题讨论】:
-
“它不起作用”是什么意思?是内核启动失败还是内核启动并在内部崩溃?也许只是内核内部的绑定检查失败。
-
@hubs:从 385 开始输出错误,这很奇怪。
-
如果它以 385 个线程开始并且结果将是错误的,那么您的内核源代码肯定会出现故障。但是不看你的内核代码就很难说。
-
@hubs:不,我的意思是,如果我输入 blockDim = 385 输出是错误的,并且整个输出都是错误的,不仅仅是从 385 开始,而是所有 M*512 值。我将添加内核代码...
-
作为一般规则,您应该在任何情况下检查线程是否要在您分配的内存中访问。尝试使用
cuda-memcheck运行您的程序
标签: cuda