Manipulación de funciones y API del controlador CUDA

Tengo un proyecto que requiere C++11, así que separo los archivos en dos categorías: los que usan C++11 y los que usan C++03 y, por lo tanto, son compatibles con el compilador nvcc. Cuando tengo un kernel que no es una función de plantilla, es fácil cargar el módulo y encontrar el nombre de la función usando cuModuleGetDataEx. Sin embargo, cuando el kernel es una plantilla, el nombre de la función se altera después de una especialización explícita. Esto hace que sea difícil obtener un identificador de la función después de cargar el módulo mediante la API del controlador CUDA. Por ejemplo, considere esta función.

template <class T, class SizeType>
global void
vector_add(const T* a, const T* b, T* c, const SizeType dim)
{
    const SizeType i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < dim) { c[i] = a[i] + b[i]; }
}

Después de compilarlo en código PTX, el nombre destrozado es _Z10vector_addIfjEvPKT_S2_PS0_T0_. ¿Cómo puedo encontrar y cargar fácilmente las funciones del kernel de plantilla desde mi código de host, sin encontrarlas manualmente en el archivo y copiar sus nombres?

preguntado el 03 de mayo de 12 a las 17:05

Supongo que puede crear funciones de contenedor que ejemplifiquen explícitamente cada versión de la plantilla que necesita y coloque los tipos en los nombres de función de las funciones de contenedor. -

Eso es cierto, pero ¿no pierdo la capacidad de compilar JIT con el código PTX? Todavía necesitaría saber el nombre de la función para recuperar un identificador después de usar cuModuleGetDataEx. -

Responderme a mí mismo: No, no lo haces. Puedes usar el --ptxas-options indicador para especificar las mismas opciones JIT durante el proceso de compilación. Sin embargo, todavía me pregunto si hay una solución más elegante. -

@RogerDahl Sí, lo sé, pero la razón más importante por la que estoy usando plantillas es porque no sé los tipos sobre los cuales se parametrizarán las funciones (y no serán primitivas simples). -

1 Respuestas

Blockquote Tengo un proyecto que requiere C++11.

Debe ser una broma, tu programa requiere un prototipo de compilador... No mencionaste el compilador que estás usando, pero se parece a gcc.

Conoce tu compilador

Estoy bastante seguro de que su parte CUDA no requiere C ++ 11, coloque todo junto con los archivos C ++ 03 y siga como de costumbre, usando una biblioteca si es necesario para vincular con C ++ 11 proto-compiler-generated-ejecutable, es de última generación.

contestado el 29 de mayo de 12 a las 06:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.