CURAND_STATUS_LAUNCH_FAILURE + CUDA 7.5
CURAND_STATUS_LAUNCH_FAILURE + CUDA 7.5
我的代码如下:
#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上没有任何运行时错误。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 在cuda线程之间共享大量常量数据
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- CUDA内核和数学函数的显式命名空间
- CUDA:统一内存和指针地址的更改
- 调试 CUDA MMU 故障
- 使用 CUDA 和纹理进行图像减法
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- 编译 CUDA 与数学函数的叮当
- 为什么 CUDA 不会导致C++代码加速?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- CUDA三角函数中的数学保证
- CUDA 使用共享内存平铺 3D 卷积实现
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- CUDA:cudaMallocManage处理退出吗?
- Opencv 加速与 CUDA 在 C++.
- Cuda:具有位集数组的 XOR 单位集
- 用于构建 cuda .so 文件(共享库)的生成文件