我创建了一个在GPU上运行的简单C程序。它通过.exe运行时效果很好但是,每当我使用nvprof进行性能分析时,它会导致我的系统变得不稳定(它每隔x秒冻结一次)并需要重新启动才能使系统再次正常运行。任何见解将不胜感激。
我在启动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'
似乎没有任何影响。
系统规格:
NVIDIA驱动程序:
以下是程序输出:
块数:1
每块的线程数:32
值0.000000
价值2.000000
价值4.000000
价值6.000000
价值8.000000
价值10.000000
价值12.000000
价值14.000000
价值16.000000
价值18.000000
已完成******< - GPU流程完成
**这是cudaGetDeviceProperties(...)的输出以获取更多详细信息**
设备数量: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驱动程序
...最后,这是我编译的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都非常低