我有一个调用另一个空内核的内核。但是,当调用内核调用cudaDeviceSynchronize()时,内核崩溃并且执行直接进入主机。内存检查程序不报告任何内存访问问题。 有谁知道这种不文明行为的原因是什么?
只有当我从调试器运行代码(Visual Studio - > Nsight - >启动CUDA调试)时才会发生崩溃。 每次运行代码时都不会发生崩溃 - 有时它会崩溃,有时它会完成。
以下是重现问题的完整代码:
#include <cuda_runtime.h>
#include <curand_kernel.h>
#include "device_launch_parameters.h"
#include <stdio.h>
#define CUDA_RUN(x_, err_) {cudaStatus = x_; if (cudaStatus != cudaSuccess) {fprintf(stderr, err_ " %d - %s\n", cudaStatus, cudaGetErrorString(cudaStatus)); int k; scanf("%d", &k); goto Error;}}
struct computationalStorage {
float rotMat;
};
__global__ void drawThetaFromDistribution() {}
__global__ void chainKernel() {
computationalStorage* c = (computationalStorage*)malloc(sizeof(computationalStorage));
if (!c) printf("malloc error\n");
c->rotMat = 1.0f;
int n = 1;
while (n < 1000) {
cudaError_t err;
drawThetaFromDistribution<<<1, 1>>>();
if ((err = cudaGetLastError()) != cudaSuccess)
printf("drawThetaFromDistribution Sync kernel error: %s\n", cudaGetErrorString(err));
printf("0");
if ((err = cudaDeviceSynchronize()) != cudaSuccess)
printf("drawThetaFromDistribution Async kernel error: %s\n", cudaGetErrorString(err));
printf("1\n");
++n;
}
free(c);
}
int main() {
cudaError_t cudaStatus;
// Choose which GPU to run on, change this on a multi-GPU system.
CUDA_RUN(cudaSetDevice(0), "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?");
// Set to use on chip memory 16KB for shared, 48KB for L1
CUDA_RUN(cudaDeviceSetCacheConfig ( cudaFuncCachePreferL1 ), "Can't set CUDA to use on chip memory for L1");
// Set a large heap
CUDA_RUN(cudaDeviceSetLimit(cudaLimitMallocHeapSize, 1024 * 10 * 192), "Can't set the Heap size");
chainKernel<<<10, 192>>>();
cudaStatus = cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
printf("Something was wrong! Error code: %d", cudaStatus);
}
CUDA_RUN(cudaDeviceReset(), "cudaDeviceReset failed!");
Error:
int k;
scanf("%d",&k);
return 0;
}
如果一切顺利,我希望看到:
00000000000000000000000....0000000000000001
1
1
1
1
....
当一切正常时,这就是我得到的。然而当它崩溃时:
000000000000....0000000000000Something was wrong! Error code: 30
正如您所看到的,err = cudaDeviceSynchronize();
语句未完成,并且执行直接进入主机,其cudaDeviceSynchronize();
失败并显示未知错误代码(30 = cudaErrorUnknown)。
系统:CUDA 5.5,NVidia-Titan(无头),Windows 7x64,Win32应用程序。 更新:附加的Nvidia显卡驱动显示屏,Nsight 3.2.0.13289。
答案 0 :(得分:1)
最后一个事实可能是至关重要的事实。您没有提到您使用的是哪个版本的nsight VSE,也没有提到您的确切机器配置(例如,机器中是否有其他GPU,如果有,这会驱动显示器?),但至少up till recently它不是可以使用nsight VSE在单GPU模式下调试动态并行应用程序。
current feature matrix还表明尚不支持单GPU CDP调试。
在您的情况下,可能的一种可能的解决方法是添加另一个GPU来驱动显示器,并使Titan卡无头(即不要连接任何显示器,也不要将Windows桌面扩展到该GPU上)。
我使用和不使用cuda-memcheck运行你的应用程序,但我觉得它没有任何问题。