Cuda Visual Profiler 未指定的启动失败

Posted

技术标签:

【中文标题】Cuda Visual Profiler 未指定的启动失败【英文标题】:Cuda Visual Profiler unspecified launch failure 【发布时间】:2011-11-16 05:31:59 【问题描述】:

所以当我运行我的代码时,它执行得很好,但是当我尝试在 Visual Profiler 中运行它时,它第一次运行,但它似乎想要运行程序七次,第二次它导致未指定发射失败。为什么会这样?我的代码如下所示,我的错误检查告诉我错误发生在 cudaMemcpy(p->siteset, rsites, sitesize, cudaMemcpyDeviceToHost); (通过搜索memcpy11可能最容易在代码中找到,它将是上面的行)

我想不出一个程序在第二次运行但不是第一次运行时基本上会出现段错误的原因,如果我在终端中多次运行它完全没问题。任何人都可以想出可能发生的事情吗? 谢谢!

void fillin(node *p, node *left, node *rt)

size_t stepsize = chars * sizeof(long);
size_t sitesize = chars * sizeof(sitearray);
seqptr lsites;
    cudaMalloc((void **) &lsteps, stepsize);

    checkCUDAError("malloc");
    cudaMalloc((void **) &lsites, sitesize);
    checkCUDAError("malloc");
    cudaMemcpy(lsteps, left->numsteps, stepsize, cudaMemcpyHostToDevice);
    checkCUDAError("memcpy7");
    cudaMemcpy(lsites, left->siteset, sitesize, cudaMemcpyHostToDevice);
    checkCUDAError("memcpy8");
    steptr rsteps;
    seqptr rsites;
    cudaMalloc((void **) &rsteps, stepsize);
    checkCUDAError("malloc");
    cudaMalloc((void **) &rsites, sitesize);
    checkCUDAError("malloc");
    cudaMemcpy(rsteps, rt->numsteps, stepsize, cudaMemcpyHostToDevice);
    checkCUDAError("memcpy9");
    cudaMemcpy(rsites, rt->siteset, sitesize, cudaMemcpyHostToDevice);
    checkCUDAError("memcpy");
    //call kernel
    int block_size = 1;
    int n_blocks = chars;
    fillinBoth <<<n_blocks, block_size>>> (lsteps, lsites, rsteps, rsites, chars);
    cudaMemcpy(p->numsteps, rsteps, stepsize, cudaMemcpyDeviceToHost);
    checkCUDAError("memcpy10");
    cudaMemcpy(p->siteset, rsites, sitesize, cudaMemcpyDeviceToHost);
    checkCUDAError("memcpy11");
    cudaFree(rsites); cudaFree(rsteps);
    cudaFree(lsites); cudaFree(lsteps);
    checkCUDAError("free");

__global__ void fillinBoth (steptr lsteps, seqptr lsite, steptr rsteps, seqptr rsite, long max)
boolean counted;
aas aa;
long s;
long i, j, k, n;
int idx = blockIdx.x;
//reduce array references; may or may not be useful
__shared__ long ls[3];
__shared__ long rs[3];
__shared__ long qs[3];
counted = false;
k = 0;
//computation from original program, but now need to do manual address calculation
if(idx < max)
    for(i = 0; i < 3; i++)
        rs[i]=rsite[idx][i];
        ls[i]=lsite[idx][i];
    
    n = lsteps[idx] + rsteps[idx];
    counted = false;
    for (i = 0; i <= 5; i++) 
        if (k < 3) 
            switch (i) 

                case 0:
                    s = ls[0] & rs[0];
                    break;

                case 1:
                    s = (ls[0] & rs[1]) | (ls[1] & rs[0]);
                    break;

                case 2:
                    s = (ls[0] & rs[2]) | (ls[1] & rs[1]) | (ls[2] & rs[0]);
                    break;

                case 3:
                    s = ls[0] | (ls[1] & rs[2]) | (ls[2] & rs[1]) | rs[0];
                    break;

                case 4:
                    s = ls[1] | (ls[2] & rs[2]) | rs[1];
                    break;

                case 5:
                    s = ls[2] | rs[2];
                    break;
            
            if (counted || s != 0) 
                qs[k] = s;
                k++;
                counted = true;
             else if (!counted)
                n += cudaWeight[idx];
        
    
    for (i = 0; i <= 1; i++) 
        for (aa = ala; (long)aa <= (long)stop; aa = (aas)((long)aa + 1)) 
            if (((1L << ((long)aa)) & qs[i]) != 0) 
                for (j = i + 1; j <= 2; j++)
                    qs[j] |= cudaTranslate[(long)aa - (long)ala][j - i];
            
        
    
    rsteps[idx] = n;
    for(i = 0; i < 3; i++)
        rsite[idx][i]=qs[i];

【问题讨论】:

尝试使用cudamemchk 运行代码,看看它是否报告了一些越界的内存访问。分析器的每次运行都会检测不同的东西,如果超出范围的访问将是“潜在的”,那么特定于芯片资源的分析器可能会被您的代码损坏。 我在上面运行了 cuda-memcheck 并且没有出现任何错误 ========= 错误摘要:0 个错误 它还有什么问题吗? 【参考方案1】:

尝试禁用配置文件会话设置中的所有计数器。还可以尝试从您的工作文件夹中删除所有文件,如“temp_compute_profiler_1_1.csv”(请参阅​​配置文件设置“工作文件夹”,默认情况下与您的可执行文件的位置相同)。

同样的错误(OpenCL over CUDA):http://www.khronos.org/message_boards/viewtopic.php?t=4324

【讨论】:

以上是关于Cuda Visual Profiler 未指定的启动失败的主要内容,如果未能解决你的问题,请参考以下文章

解释 NVIDIA Visual Profiler 输出

Visual Studio/CMake 中未解析的外部符号 cuda_library::foo(int)

markdown 如何使用NVIDIA profiler #cuda

使用 CUDA Profiler nvprof 进行内存访问

Cuda profiler 说我的两个内核很贵,但是它们的执行时间似乎很短

CUDA 错误消息:未指定的启动失败