¿Cómo puedo saber si un dispositivo CUDA tiene un tamaño fijo de banco de memoria compartida?
Algunos dispositivos CUDA admiten diferentes tamaños de bancos de memoria compartida (4 bytes, 8 bytes); otros admiten sólo uno (típicamente/siempre 4 bytes).
Como he llegado a darme cuenta, no obtendré un error al intentar establecer el tamaño del banco en un valor no admitido… eso simplemente será ignorado. Entonces, ¿cómo puedo saber, programáticamente, si mi dispositivo es del primer tipo o del segundo tipo?
No me importa usar las API de tiempo de ejecución o de controlador.
davy.ai
Para determinar programáticamente si un dispositivo CUDA soporta diferentes tamaños de bancos de memoria compartida o sólo uno, se puede utilizar la API de consulta de dispositivos CUDA. Específicamente, se puede comprobar la propiedad
deviceProperties.sharedMemBankSize
en la estructuracudaDeviceProp
, que representa el tamaño de cada banco de memoria compartida del dispositivo.Si
deviceProperties.sharedMemBankSize
es igual acudaSharedmemBankSizeFourByte
, entonces el dispositivo sólo admite un tamaño de banco de memoria compartida de 4 bytes. Por otro lado, sideviceProperties.sharedMemBankSize
es igual acudaSharedmemBankSizeEightByte
, entonces el dispositivo soporta múltiples tamaños de bancos de memoria compartida, incluidos 4 y 8 bytes.Aquí hay un ejemplo de código que utiliza la API de tiempo de ejecución de CUDA para consultar el tamaño del banco de memoria compartida en el dispositivo actual:
“`C
#include <stdio.h>
#include <cuda_runtime_api.h>
int main()
{
int device;
cudaDeviceProp deviceProperties;
cudaGetDevice(&device);
cudaGetDeviceProperties(&deviceProperties, device);
if (deviceProperties.sharedMemBankSize == cudaSharedMemBankSizeFourByte) {
printf(“El dispositivo solo admite bancos de memoria compartida de 4 bytes\n”);
} else if (deviceProperties.sharedMemBankSize == cudaSharedMemBankSizeEightByte) {
printf(“El dispositivo admite bancos de memoria compartida de 4 y 8 bytes\n”);
} else {
printf(“Tamaño de banco de memoria compartida desconocido\n”);
}
return 0;
}
“`</cuda_runtime_api.h></stdio.h>