CURAND_STATUS_LAUNCH_FAILURE + CUDA 7.5

CURAND_STATUS_LAUNCH_FAILURE + CUDA 7.5

本文关键字:CUDA FAILURE STATUS LAUNCH CURAND      更新时间:2023-10-16

我的代码如下:

#include <cuda_runtime.h>
#include <cuda.h>
#include <curand.h>
#include <stdio.h>
#define gpuErrorCheckCurand(ans) { gpuAssertCurand((ans), __FILE__, __LINE__); }
#define gpuErrorCheckCuda(ans) { gpuAssert((ans), __FILE__, __LINE__); }
const char* curandGetErrorString(curandStatus_t status)
{
    switch(status)
    {
    case CURAND_STATUS_SUCCESS: return "CURAND_STATUS_SUCCESS";
    case CURAND_STATUS_VERSION_MISMATCH: return "CURAND_STATUS_VERSION_MISMATCH";
    case CURAND_STATUS_NOT_INITIALIZED: return "CURAND_STATUS_NOT_INITIALIZED";
    case CURAND_STATUS_ALLOCATION_FAILED: return "CURAND_STATUS_ALLOCATION_FAILED";
    case CURAND_STATUS_TYPE_ERROR: return "CURAND_STATUS_TYPE_ERROR";
    case CURAND_STATUS_OUT_OF_RANGE: return "CURAND_STATUS_OUT_OF_RANGE";
    case CURAND_STATUS_LENGTH_NOT_MULTIPLE: return "CURAND_STATUS_LENGTH_NOT_MULTIPLE";
    case CURAND_STATUS_DOUBLE_PRECISION_REQUIRED: return "CURAND_STATUS_DOUBLE_PRECISION_REQUIRED";
    case CURAND_STATUS_LAUNCH_FAILURE: return "CURAND_STATUS_LAUNCH_FAILURE";
    case CURAND_STATUS_PREEXISTING_FAILURE: return "CURAND_STATUS_PREEXISTING_FAILURE";
    case CURAND_STATUS_INITIALIZATION_FAILED: return "CURAND_STATUS_INITIALIZATION_FAILED";
    case CURAND_STATUS_ARCH_MISMATCH: return "CURAND_STATUS_ARCH_MISMATCH";
    case CURAND_STATUS_INTERNAL_ERROR: return "CURAND_STATUS_INTERNAL_ERROR";
    }
    return "Unknown cuRAND error";
}
inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=false) {
    if (code != cudaSuccess) {
        printf("GPU assert: %s %s %dn", cudaGetErrorString(code), file, line);
        if (abort) exit(code);
   }
}
inline void gpuAssertCurand(curandStatus_t code, const char *file, int line, bool abort=false) {
    if (code != CURAND_STATUS_SUCCESS) {        
        printf("GPU (CURAND) assert: %s %s %dn", curandGetErrorString(code), file, line);
    if (abort) exit(code);
   }
}

int main() {
    curandGenerator_t generator;
    int n = 100;
    gpuErrorCheckCurand(curandCreateGenerator(&generator, CURAND_RNG_PSEUDO_DEFAULT));
    gpuErrorCheckCurand(curandSetPseudoRandomGeneratorSeed(generator, 1234ULL));
    float* uniformDevice; gpuErrorCheckCuda(cudaMalloc(&uniformDevice, n * sizeof(float)));
    gpuErrorCheckCurand(curandGenerateUniform(generator, uniformDevice, n)); 
    gpuErrorCheckCurand(curandDestroyGenerator(generator));
    gpuErrorCheckCuda(cudaFree(uniformDevice));
}

我用命令编译上述代码:

nvcc rand.cu -lcurand

对于记录,我的图形卡是GTX 1060,我将CUDA 7.5与驱动程序版本375.39一起使用。问题是错误状态 CURAND_STATUS_LAUNCH_FAILURE 在生成随机数中。Cuda-memcheck的结果是:

Program hit cudaErrorInvalidDeviceFunction (error 8) due to "invalid device function" on CUDA API call to cudaGetLastError. 

有人知道怎么了吗?

您需要切换到CUDA 8。

CUDA 7.5中的Curand库是无意中构建的,没有PTX以供远程兼容,因此不能在Pascal(CC 6.X(GPU上使用。

这里还有一些其他讨论。

fwiw您的代码在CC 6.1 GPU上没有任何运行时错误。