我的程序是这样的,每个线程处理这样一个结构体:
struct ST{
unsigned char index[240];
int flag;
};
总共有ST[40000]个。
核函数启动参数配置也应该没问题,用Nsight调试CUDA出现这个问题:CUDA Grid launch failed ,后面是CUContext号和CUmodule号,不知道哪里出了问题。。再此问一下各位哪些原因会导致这个现象?不胜感激!
我的程序是这样的,每个线程处理这样一个结构体:
struct ST{
unsigned char index[240];
int flag;
};
总共有ST[40000]个。
核函数启动参数配置也应该没问题,用Nsight调试CUDA出现这个问题:CUDA Grid launch failed ,后面是CUContext号和CUmodule号,不知道哪里出了问题。。再此问一下各位哪些原因会导致这个现象?不胜感激!
LZ您好:
1:这个应该是kernel启动参数的问题或者资源使用的问题。
2:您只给出了一个结构体的定义,而没有给出全部的的代码,所以无法判断您的问题在哪里。
大致如此,请您进一步补充您的具体情况。
祝您好运~
也许是每个thread block(线程块)太大了,我遇到过这种问题
发代码,你这样让人猜谜是不行的。
Launch Failed不仅仅是启动时候的形状的问题,你kernel内部的越界之类的也会产生此问题。
以及,如果实在不方便发代码,你将你nsight提示的哪个图发一下,那个里面有详细信息。
感谢千军兄回帖!截图不太方便,写一些代码先看一下吧。。
1.定义结构体如上;
2.主机端分配内存:
ST* h_st;h_st = (ST*)malloc(460*576*sizeof(ST));
3.设备端分配内存:
ST* d_st;
cudaMalloc((void**)&d_st,460*576*sizeof(ST));
4.复制数据:
cudaMemcpy((void*)d_st,(void*)h_st,460*576*sizeof(ST));
5.配置核函数启动参数:
dim3 threadsPerBlock(32,32,1);
dim3 blocksPerGrid((460+32-1)/32,(576+32-1)/32,1);
6.启动核函数:
Mykernel<<<blocksPerGrid,threadsPerBlock>>>(d_st);
7.用的显卡是Quadro 4000,8*32cores.
8.核函数内部有涉及数组的操作,检查了一下代码上没有越界的地方。
还有几个问题:
Q1:主机端分配内存时,使用malloc或者calloc对后面的复制操作有影响不?
Q2:核函数的最后一步是要对所有的(460576)个240维向量扩展成256维做傅里叶变换,如果使用cufft库是不是只能在主机代码内循环460576次?想要在线程中做变换是不是就要自己实现代码而不用cufft库?
LZ您好:
都好几天了,您的问题解决了么?
如需进一步帮助,请按照4#的建议发代码,这是一条多快好省的途径。
祝您好运~
恩现在运行可以,在核函数里的操作也对的。就是还有个问题,使用Nsight的CUDA调试功能会出现Grid launch failed,但是直接用VS 2008的调试运行又是对的,这是Nsight的问题吗?
您确定您直接VS运行结果是正确的吗?
以及,您始终拒绝发kernel代码,甚至连nsight的错误提示图都拒绝给出。
您的问题我无法继续解答了。
您可以提出问题然后论坛为您解答,但是您不能强迫论坛倒求着您,哭着,喊着为您解答。
请三思。
楼主您还有7天的时间提供代码,如果超出7天,我将关闭这个主题。
直接运行正确不代表您真的正确。
举个例子说,
cudaMalloc会使用一个默认大小为1MB的heap进行分配的,哪怕您的代码只分配了1B, 但是您直接运行可以安全的写入到1MB. 例如:
global void cat(int *p) { p[1] = 0;} //注意是写到了p[1]!
…
int *p = NULL;
cudaMalloc(&p, 1);
cat<<<1,1>>>(p);
cudaErrot_t result = cudaDeviceSynchronize();
那么这个result,在您直接运行的时候,应该返回cudaSuccess的(不用怀疑这个,这是我和ICE很久之前做过的一个试验)。
但是虽然返回的是cudaSuccess, 但严格来说,您已经越界了,算法已经出错了。但是您直接运行是看不出来的。(您可以一直越界到1MB才会cuda error unknown的)
但是如果您在nsight(前提是您没有关闭nsight的访存检查选项)下运行,您将可能会立刻得到一个错误提示: 某block中的某线程因为****行为而导致了错误。
所以您看,这是我一直让您提供代码和/或nsight的错误提示的截图的原因。
这会帮助您尽快找到问题,解决问题。
如果您认为您现在的直接运行是“无问题的”,“可以接受的”,那么您也可以不做回复。
(但您在nsight下报错是个隐患,严肃点说,这就是BUG)
感谢您的莅临。