Estoy trabajando en una aplicación de cálculo numérico utilizando el marco CUDA. Tengo algunos datos estáticos que deben ser accesibles a todas las roscas, por lo que lo he puesto en la memoria constante de esta manera:¿Cómo usar la memoria constante CUDA de forma agradable?
__device__ __constant__ CaseParams deviceCaseParams;
utilizo el cudaMemcpyToSymbol llamada a transferir estos parametros desde el host al dispositivo:
void copyMetaData(CaseParams* caseParams)
{
cudaMemcpyToSymbol("deviceCaseParams", caseParams, sizeof(CaseParams));
}
que funciona.
De todos modos, parece (por ensayo y error, y también por mensajes de lectura en la red) que por alguna razón enferma, la declaración de deviceCaseParams y la operación de copia de la misma (la llamada a cudaMemcpyToSymbol) deben estar en el mismo archivo. Por el momento tengo estos dos en un archivo .cu, pero realmente quiero tener el parámetro struct en un archivo .cuh para que cualquier implementación pueda verlo si lo desea. Eso significa que también tengo que tener la función copyMetaData en el archivo de encabezado a, pero esto arruina el enlace (el símbolo ya está definido) ya que ambos archivos .cpp y .cu incluyen este encabezado (y así el compilador MS C++ y nvcc lo compilan)
¿Alguien tiene algún consejo sobre diseño aquí?
Actualización: Ver los comentarios
¿Estás seguro de que deben estar en el mismo archivo y no solo en la misma unidad de traducción? (es decir, la declaración podría estar en el archivo de encabezado, que luego se #incluye en el archivo de origen). –
Lo intenté hace un par de minutos y parece que tienes razón. Sin embargo, no entiendo lo que salió mal cuando probé la última vez. Funciona ahora seguro. Gracias. –