Cuda内核无法启动

Cuda内核无法启动,cuda,gpgpu,gpu,Cuda,Gpgpu,Gpu,这是我的密码。我有一个(x,y)对数组。我想计算每个坐标的最远点 #define GPUERRCHK(ans) { gpuAssert((ans), __FILE__, __LINE__); } inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true) { if (code != cudaSuccess) { fprintf(stderr,"GPUassert: %s %s

这是我的密码。我有一个(x,y)对数组。我想计算每个坐标的最远点

#define GPUERRCHK(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
   if (code != cudaSuccess)
   {
      fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
      if (abort) exit(code);
   }
}

__device__ float computeDist( float x1, float y1, float x2, float y2 )
{
    float delx = x2 - x1;
    float dely = y2 - y1;
    return sqrt( delx*delx + dely*dely );
}

__global__ void kernel( float * x, float * y, float * dev_dist_sum, int N )
{
    int tid = blockIdx.x*gridDim.x + threadIdx.x;
    float a = x[tid];  //............(alpha)
    float b = y[tid];  //............(beta)
    if( tid < N )
    {
    float maxDist = -1;
    for( int k=0 ; k<N ; k++ )
    {
        //float dist = computeDist( x[tid], y[tid], x[k], y[k] ); //....(gamma)
        float dist = computeDist( a, b, x[k], y[k] );             //....(delta)
        if( dist > maxDist )
        maxDist = dist; 
    }
    dev_dist_sum[tid] = maxDist;
    }
}

int main()
{
.
.

    kernel<<<(N+31)/32,32>>>( dev_x, dev_y, dev_dist_sum, N );
    GPUERRCHK( cudaPeekAtLastError() );
    GPUERRCHK( cudaDeviceSynchronize() );

.
.

}
#定义gpuerchk(ans){gpuAssert((ans),uuuu文件,uuu行uuu)}
内联void gpuAssert(cudaError\u t代码,char*文件,int行,bool abort=true)
{
如果(代码!=cudaSuccess)
{
fprintf(标准,“GPUassert:%s%s%d\n”,cudaGetErrorString(代码)、文件、行);
如果(中止)退出(代码);
}
}
__设备浮点计算列表(浮点x1、浮点y1、浮点x2、浮点y2)
{
浮点数delx=x2-x1;
浮动dely=y2-y1;
返回sqrt(delx*delx+dely*dely);
}
__全局无效内核(float*x,float*y,float*dev\u dist\u sum,int N)
{
int tid=blockIdx.x*gridDim.x+threadIdx.x;
浮点数a=x[tid];//………(α)
浮动b=y[tid];//………(β)
如果(tid
我有一辆英伟达GeForce 420M。我已经在我的电脑上验证了cuda是否可以使用它。当我以N=50000运行上述代码时,内核无法启动,抛出错误消息“unspecified error message”。但是,对于较小的值(如10000),它似乎可以正常工作

此外,如果我注释掉alpha、beta、delta(请参见代码中的标记)和uncomment gamma,那么代码甚至可以用于较大的N值,比如50000或100000

我想使用alpha和beta,通过更多地使用线程内存而不是全局内存来减少内存流量


如何对该问题进行排序?

@mkuse。gridDim可以可视化为网格中线程块的二维空间排列,blockDim是线程的三维空间排列。例如,dim3 gridDim(2,3,1)表示x方向上的2个螺纹块和y方向上的3个螺纹块。您最多可以使用65536=2^16。dim3块DIM(32,16,1)处于线程粒度。x方向的32个线程和y方向的16个线程总计为512个线程。您可以使用线程id访问每个线程。但是,由于您有多个块,您必须使用相应的blockDIM和gridDIM标识线程

1)tid计算可能应为tid=blockIdx.x*blockDim.x+threadIdx.x。2) CC<3.0时,网格的最大x尺寸为65535。3) 伽马和δ之间应该没有区别。4) CC<3.0时,每个SM的最大块数为8。启动配置将占用率限制在16%(256/1536)。将入住率提高到至少50%将提高性能。较大的块可能会提高L1命中率。将L1设置为48KB也可以提高性能。@GregSmith。您的解决方案适用于tid设置。但我现在对gridDim和blockDim之间的区别感到困惑。gridDim是否可以给出块数?你也可以澄清一下你的第(4)条。我现在是cuda的新手。入住率是一个复杂的讨论点。我建议你看一下幻灯片。使用blockDim(32,1,1)的发射最大占用率为8/48。这不足以隐藏内存延迟。如果增加blockDim.x,则可以减少gridDim。这将导致每个SM产生更多扭曲,从而改进延迟隐藏。