我创建了一个在GPU上运行的简单C程序 . 它通过.exe运行时效果很好但是,每当我使用nvprof进行性能分析时,它会导致我的系统变得不稳定(它每隔x秒冻结一次)并需要重新启动才能使系统再次正常运行 . 任何见解将不胜感激 .
I DO get this Warning when starting nvprof ,这可能是问题,我该如何纠正? (我有相同的卡片,如下面的信息所示:) .
== 7596 == NVPROF正在分析过程7596,命令: . \ whatup.exe == 7596 ==警告:当前配置不支持统一内存分析,因为检测到一对没有对等支持的设备这种多GPU设置 . 当对等映射不可用时,系统将回退到使用零拷贝内存 . 它可能导致访问统一内存的内核运行速度变慢 . 更多详情请访问:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#um-managed-memory
设置 'SET CUDA_MANAGED_FORCE_DEVICE_ALLOC=1'
或 'SET CUDA_VISIBLE_DEVICES=1'
似乎没有任何影响 .
System Specs:
-
Windows 10 Pro x64
-
i7-6800K
-
64 GB DDR4
-
2 x EVGA 980Ti(SLI)
NVIDIA Drivers:
-
显示驱动程序:390.65
-
Geforce经验:3.12.0.84
-
3D视觉控制器驱动程序:390.41
-
3D Vision:390.65
-
CUDA v9.1
Here is the program output:
块数:1
每个块的线程数:32
值0.000000
Value 2.000000
Value 4.000000
Value 6.000000
Value 8.000000
Value 10.000000
Value 12.000000
Value 14.000000
Value 16.000000
Value 18.000000
已完成****** < - GPU流程完成
这是cudaGetDeviceProperties(...)的输出以获取更多详细信息
Device Count: 2
设备0:GeForce GTX 980 Ti
设备0,MaxThreadsPerBlock:1024
设备0,TotalGlobalMem:6442450944
设备0,SharedMemPerBlock:49152
设备0,主要:5
设备0,次要:2
设备0,ClockRate:1190000
设备0,ECCEnabled:0
设备0,TccDriver:0
设备0,ComputeMode:0
设备1:GeForce GTX 980 Ti
设备1,MaxThreadsPerBlock:1024
设备1,TotalGlobalMem:6442450944
设备1,SharedMemPerBlock:49152
设备1,主要:5
设备1,次要:2
设备1,ClockRate:1190000
设备1,ECCEnabled:0
设备1,TccDriver:0
设备1,ComputeMode:0
1.)SLI已启用并正常工作(至少通过NVIDIA控制面板和EVGA Precision)
2.)代码在GPU上运行良好,只是无法分析它是否会导致我的机器被杀并需要重启(否则屏幕会每隔x秒冻结一次)
3.)我已经尝试了安装nvidia驱动程序的_1663189
...最后,这是我编译的C代码:nvcc myfile.cu -o thefinal.exe
更新:问题似乎与add_gpu调用无关 . 如果我更改此功能如下(add_gpu_BARE),它仍然有相同的问题导致我的屏幕每隔x秒锁定一次,直到重新启动 .
__global__
void add_gpu_BARE(float *a, float *b, float *c, float n){
c[0] = 10.0;
}
__global__
void add_gpu(float *a, float *b, float *c, float n){
int index = blockIdx.x * blockDim.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
for(int i=index; i<n; i+=stride) {
c[i] = a[i] + b[i];
}
}
void call_GPU() {
int SIZE = 1<<20;
float *a, *b, *c;
cudaMallocManaged(&a, SIZE * sizeof(float));
cudaMallocManaged(&b, SIZE * sizeof(float));
cudaMallocManaged(&c, SIZE * sizeof(float));
for(int i=0; i<SIZE; i++) {
a[i] = i;
b[i] = i;
c[i] = 0;
}
int blocks = 1;
int threads_per_blocks = 32;
add_gpu<<<blocks, threads_per_blocks>>>(a, b, c, SIZE);
cudaDeviceSynchronize();
for(int i=0; i<10; i++) {
printf("value %f\n", c[i]);
}
cudaFree(a);
cudaFree(b);
cudaFree(c);
}
int main() {
printf("Ok, running on GPU\n");
call_GPU();
printf("COMPLETED******\n");
return 0;
}
1.)指定256个线程会导致nvprof永远不会返回
2.)指定32个工作但导致系统不稳定
3.)数组大小似乎没有影响
4.)分析时两张卡的内存/ CPU都非常低