c++ - CURAND_STATUS_LAUNCH_FAILURE + CUDA 7.5

标签 c++ random cuda nvidia

我的代码如下:

#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 %d\n", 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 %d\n", 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,我使用的是驱动程序版本为 375.39 的 CUDA 7.5。问题是生成随机数期间的错误状态 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 上使用。

关于这个 here 有一些额外的讨论.

FWIW 你的代码在 CUDA 8 上的 cc 6.1 GPU 上运行时对我来说没有任何运行时错误。

关于c++ - CURAND_STATUS_LAUNCH_FAILURE + CUDA 7.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43748004/

相关文章:

c++ - 正则表达式 C++ Qt

python - 在 Python 中比较随机结果并将其转换为 JSON 文件上的 "points"的简单方法

mysql - 使用除 ID 以外的随机值在 MySQL 中添加新记录

c - C 中的 rand 函数问题

c++ - 数组结构与结构数组

c++ - 在 GPU 上调用函数时可以避免使用 __device__ 限定符吗?

c - 为什么我的c程序突然用了30g的虚拟内存?

c++ - 从 Binary Mask (Segmentation) 获取 .STL 格式的 3D 网格

c++ - 如何通过地址传递 char 指针以接受 char**?

c++ - 如果我的源文件中使用了常量,我该如何使编译正常停止?