ultima gpus developer cuda gpu gpgpu nvidia

gpus - cuda ultima version



¿Cómo asigna CUDA las ID de dispositivos a las GPU? (3)

Cuando una computadora tiene múltiples GPU compatibles con CUDA, a cada GPU se le asigna una device ID . Por defecto, los núcleos CUDA se ejecutan en el device ID 0 . Puede usar cudaSetDevice(int device) para seleccionar un dispositivo diferente.

Digamos que tengo dos GPU en mi máquina: una GTX 480 y una GTX 670. ¿Cómo decide CUDA qué GPU es el device ID 0 y qué GPU es el device ID 1 ?

Ideas sobre cómo CUDA podría asignar ID de dispositivo (solo una lluvia de ideas):

  • orden descendente de la capacidad de cálculo
  • Número de ranura PCI
  • fecha / hora en que se agregó el dispositivo al sistema (el dispositivo que se acaba de agregar a la computadora tiene un número de identificación más alto)

Motivación : estoy trabajando en algunos algoritmos de HPC, y los estoy evaluando y autotuning para varias GPU. Mi procesador tiene suficientes carriles PCIe para conducir cudaMemcpys a 3 GPU en ancho de banda completo. Por lo tanto, en lugar de cambiar constantemente las GPU dentro y fuera de mi máquina, planeo tener solo 3 GPU en mi computadora. Me gustaría poder predecir lo que sucederá cuando añada o reemplace algunas GPU en la computadora.


CUDA elige el dispositivo más rápido como el dispositivo 0. Por lo tanto, cuando intercambia GPU dentro y fuera, el orden puede cambiar por completo. Podría ser mejor elegir las GPU en función de su ID de bus PCI utilizando:

cudaError_t cudaDeviceGetByPCIBusId ( int* device, char* pciBusId ) Returns a handle to a compute device. cudaError_t cudaDeviceGetPCIBusId ( char* pciBusId, int len, int device ) Returns a PCI Bus Id string for the device.

o CUDA Driver API cuDeviceGetByPCIBusId cuDeviceGetPCIBusId .

Pero IMO es la forma más confiable de saber qué dispositivo es usar NVML o nvidia-smi para obtener el identificador único de cada dispositivo (UUID) usando nvmlDeviceGetUUID y luego hacer que coincida con el dispositivo CUDA con pciBusId usando nvmlDeviceGetPciInfo .


El Soporte de CUDA / Elegir una GPU sugiere que

al ejecutar un programa CUDA en una máquina con múltiples GPU, los núcleos CUDA se ejecutarán de manera predeterminada en cualquier GPU instalada en la ranura de la tarjeta gráfica principal.

Además, la discusión en No GPU seleccionado, el código funciona correctamente, ¿cómo es esto posible? sugiere que CUDA no asigna la "mejor" tarjeta al dispositivo 0 en general.

EDITAR

Hoy he instalado una PC con una tarjeta Tesla C2050 para computación y una tarjeta 8084 GS para visualización cambiando su posición entre las dos primeras ranuras PCI-E. He utilizado deviceQuery y he notado que la GPU 0 es siempre la primera ranura PCI y la GPU 1 que la segunda ranura PCI. No sé si esto es una declaración general, pero es una prueba de que para mi sistema las GPU no están numeradas de acuerdo con su "poder", sino de acuerdo con sus posiciones.


Establecer la variable de entorno CUDA_DEVICE_ORDER como:

export CUDA_DEVICE_ORDER=PCI_BUS_ID

Luego, las ID de GPU se ordenarán por ID de bus pci.