7

从 CUDA 设备(!)获取属性的众所周知的代码是枚举所有设备,并从那时获取属性。然后我看到这样的作品,它激活了给定的设备。

我有相反的问题——假设设备已经被选中,我想获取它的属性(活动的),而不是系统中存在的所有设备。

我希望我以正确的方式写了这个,因为我是 CUDA 的新手。

4

2 回答 2

11

只需调用cudaGetDevice()以获取活动上下文的设备号,然后调用cudaGetDeviceProperties以获取该设备的属性。在类似于以下的代码中:

int device;
cudaGetDevice(&device);

struct cudaDeviceProp props;
cudaGetDeviceProperties(&props, device);

[免责声明:用浏览器编写,从未编译或测试过。使用风险自负]

于 2013-02-10T17:07:18.663 回答
0

我在这里有一个脚本,它可以识别所有活动设备,并且每个设备都会在屏幕上返回一些有用的信息。

#include <stdio.h>

int main() {

  int nDevices;
  cudaGetDeviceCount(&nDevices);
  
  printf("Number of devices: %d\n", nDevices);
  
  for (int i = 0; i < nDevices; i++) {
    cudaDeviceProp prop;
    cudaGetDeviceProperties(&prop, i);
    printf("Device Number: %d\n", i);
    printf("  Device name: %s\n", prop.name);
    printf("  Memory Clock Rate (MHz): %d\n",
           prop.memoryClockRate/1024);
    printf("  Memory Bus Width (bits): %d\n",
           prop.memoryBusWidth);
    printf("  Peak Memory Bandwidth (GB/s): %.1f\n",
           2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6);
    printf("  Total global memory (Gbytes) %.1f\n",(float)(prop.totalGlobalMem)/1024.0/1024.0/1024.0);
    printf("  Shared memory per block (Kbytes) %.1f\n",(float)(prop.sharedMemPerBlock)/1024.0);
    printf("  minor-major: %d-%d\n", prop.minor, prop.major);
    printf("  Warp-size: %d\n", prop.warpSize);
    printf("  Concurrent kernels: %s\n", prop.concurrentKernels ? "yes" : "no");
    printf("  Concurrent computation/communication: %s\n\n",prop.deviceOverlap ? "yes" : "no");
  }
}

注意:将代码片段放在.cu文件中并使用nvcc.

例如,在我的带有一个 GPU 的桌面上,屏幕上的消息是:

Number of devices: 1
Device Number: 0
  Device name: Quadro K5200
  Memory Clock Rate (MHz): 2933
  Memory Bus Width (bits): 256
  Peak Memory Bandwidth (GB/s): 192.3
  Total global memory (Gbytes) 7.4
  Shared memory per block (Kbytes) 48.0
  minor-major: 5-3
  Warp-size: 32
  Concurrent kernels: yes
  Concurrent computation/communication: yes
于 2021-11-11T13:05:22.437 回答