无法运行CUDA内核:请求启动的资源太多

无法运行CUDA内核:请求启动的资源太多,cuda,Cuda,看看我自己编写的cuda内核。我有一个大内核,但它返回了错误消息。然后我简化了它,发现它在一个循环中失败。我简化了这个循环,发现如果我使用int值或常量值来填充循环中的数据[threadIdx.x],它就可以正常工作。但如果我使用双类型值,它将返回一个错误 建议:如果您没有正确处理主机到设备之间的数据,则在使用Nsight时会收到“警告:检测到Cuda API错误:cudaLaunch返回(0x7)”消息,或者在从终端运行应用程序时会收到分段错误消息 __global__ void sumSer

看看我自己编写的cuda内核。我有一个大内核,但它返回了错误消息。然后我简化了它,发现它在一个循环中失败。我简化了这个循环,发现如果我使用int值或常量值来填充循环中的数据[threadIdx.x],它就可以正常工作。但如果我使用双类型值,它将返回一个错误


建议:如果您没有正确处理主机到设备之间的数据,则在使用Nsight时会收到“警告:检测到Cuda API错误:cudaLaunch返回(0x7)”消息,或者在从终端运行应用程序时会收到分段错误消息

__global__ void sumSeries(double* dSum,int* totalThreadNumber){
    volatile  __shared__ double data[768];
    double var=0;
    data[threadIdx.x]=0;
    for ( int i = 10 ; i < 20 ;++i){
        var=i;
        data[threadIdx.x] += (var)/(var*var+1);
        __syncthreads();
    }


}
\uuuuu全局\uuuuu无效sumSeries(双*dSum,int*totalThreadNumber){
易失性共享双数据[768];
双var=0;
数据[threadIdx.x]=0;
对于(int i=10;i<20;++i){
var=i;
数据[threadIdx.x]+=(var)/(var*var+1);
__同步线程();
}
}
为什么它不起作用?

int main() {

    int threadsPerBlock=768;
    int blockCount=8;

    int *hostThreadNumber=new int ;
        *hostThreadNumber=threadsPerBlock*blockCount;
    int* deviceThreadNumber=NULL;

    double* deviceSum=NULL;
    double* hostSum=(double*)malloc(blockCount);


    cudaError_t cuerr=cudaDeviceSetCacheConfig(cudaFuncCachePreferShared);
    if (cuerr != cudaSuccess){
        std::cout<<"Cant SetCacheConfig: "<<cudaGetErrorString(cuerr)<<std::endl;
        return -1;
    }

    cuerr=cudaMalloc(&deviceSum,blockCount*sizeof(double));//размер дабла*число блоков
    if (cuerr != cudaSuccess){
        std::cout<<"Cant allocate memory for deviceSum: "<<cudaGetErrorString(cuerr)<<std::endl;
        return -1;
    }
    cuerr=cudaMalloc(&deviceThreadNumber,sizeof(int));
    if (cuerr != cudaSuccess){
        std::cout<<"Cant allocate memory for deviceThreadNumber: "<<cudaGetErrorString(cuerr)<<std::endl;
        return -1;
    }

    cuerr = cudaMemcpy(deviceSum,hostSum,blockCount*sizeof(double),cudaMemcpyHostToDevice);
    if (cuerr != cudaSuccess){
        std::cout<<"Can not copy hostSum to device: "<<cudaGetErrorString(cuerr)<<std::endl;
        return -1;
    }
    cuerr = cudaMemcpy(deviceThreadNumber,hostThreadNumber,sizeof(int),cudaMemcpyHostToDevice);
    if (cuerr != cudaSuccess){
        std::cout<<"Can not copy hostThreadNumber to device: "<<cudaGetErrorString(cuerr)<<std::endl;
        return -1;
    }

    sumSeries<<<dim3(blockCount),dim3(threadsPerBlock)>>>(deviceSum,deviceThreadNumber);
    cuerr=cudaGetLastError();
    if (cuerr != cudaSuccess){
        std::cout<<"Cuda kernel error: "<<cudaGetErrorString(cuerr)<<std::endl;
        return -1;
    }
    cuerr= cudaDeviceSynchronize();
    if (cuerr != cudaSuccess){
        std::cout<<"Can not synchronize cuda kernel : "<<cudaGetErrorString(cuerr)<<std::endl;
        return -1;
    }
    cuerr= cudaMemcpy(hostSum,deviceSum,blockCount*sizeof(double),cudaMemcpyDeviceToHost);
    if (cuerr != cudaSuccess){
        std::cout<<"Can not copy data to host: "<<cudaGetErrorString(cuerr)<<std::endl;
        return -1;
    }
    cudaFree(deviceSum);
    cudaFree(deviceThreadNumber);
    return 0;
}
intmain(){
int threadsPerBlock=768;
int blockCount=8;
int*hostThreadNumber=新int;
*hostThreadNumber=threadsPerBlock*块计数;
int*deviceThreadNumber=NULL;
双*设备=空;
double*hostSum=(double*)malloc(blockCount);
cudaError\u t cuerr=cudaDeviceSetCacheConfig(cudaFuncCachePreferShared);
if(cuerr!=cudaSuccess){

std::cout您刚刚为
hostSum

double* hostSum=(double*)malloc(blockCount)
如果我假设您想要为其分配
blockCount*sizeof(double)
字节,那么这是错误的,因为您为
deviceSum
分配了此内存量,并将其用于主机和设备之间的内存拷贝

cuerr = cudaMalloc(&deviceSum,blockCount*sizeof(double));

cuerr = cudaMemcpy(deviceSum,hostSum,blockCount*sizeof(double),cudaMemcpyHostToDevice);

cuerr= cudaMemcpy(hostSum,deviceSum,blockCount*sizeof(double),cudaMemcpyDeviceToHost);

您遇到的确切错误是什么?能否提供完整的示例?以及您正在启动的线程/块的数量?请同时指定您正在使用的特定卡。我每个块和8个块使用768个线程。我的GPU是GeForce®GTS 450。完整示例由两部分组成(cuda内核和主函数)(我刚刚添加了它)警告:检测到Cuda API错误:cudaLaunch返回(0x7)当您直接在内核的
for
循环之前添加
#pragma unroll 1
时会发生什么?