我创建了一个在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都非常低