2011-05-19 23 views
14

Acabo de iniciar la programación CUDA y está yendo bastante bien, mis GPU son reconocidas y todo. Me he fijado parcialmente Intellisense en Visual Studio usando esta guía extremadamente útil aquí: http://www.ademiller.com/blogs/tech/2010/10/visual-studio-2010-adding-intellisense-support-for-cuda-c/Configurando VS 2010 Intellisense para llamadas al núcleo CUDA

y aquí: http://www.ademiller.com/blogs/tech/2011/05/visual-studio-2010-and-cuda-easier-with-rc2/

Sin embargo, Intellisense todavía no se darán cuenta de llamadas al kernel como este:

// KernelCall.cu 
#include <iostream> 
#include "cuda.h" 
#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

__global__ void kernel(void){} 

int main() 
{ 
    kernel<<<1,1>>>(); 

    system("pause"); 
    return 0; 
} 

El núcleo de la línea < < < 1,1 >>>() está subrayado en rojo, específicamente la flecha a la izquierda del primero con el error que dice "Error: esperado y expresión". Sin embargo, si controlo la función, su tipo de retorno y los parámetros se muestran correctamente. Todavía compila muy bien, solo me pregunto cómo deshacerse de esta pequeña molestia.

Respuesta

11

Visual Studio proporciona IntelliSense para C++, el truco del blog del científico espacial es básicamente confiar en la similitud que CUDA-C tiene con C++, nada más.

En el lenguaje C++, el análisis adecuado de los corchetes angulares es problemático. Tienes < como menos que y para las plantillas, y << como cambio, recuerda no hace mucho cuando tuvimos que poner un espacio entre las declaraciones de plantilla anidadas.

Así que resulta que el chico de NVIDIA que ideó esta sintaxis no era un experto en idiomas, y eligió el peor delimitador posible, luego lo triplicó, bueno, vas a tener problemas. Es increíble que Intellisense funcione en absoluto cuando ve esto.

La única forma que conozco de obtener IntelliSense completo en CUDA es cambiar de la API Runtime a la API de controladores. El C++ es solo C++, y el CUDA sigue siendo (más o menos) C++, no hay <<<>>> maldad para que el análisis del lenguaje tenga que funcionar.

+1

Debo decir que tiene más sentido que nadie en los foros de NVIDIA ... Entonces, ¿cómo hago lo que acaba de decir? – sj755

+1

Eche un vistazo a la diferencia entre matrixMul y matrixMulDrv. La sintaxis <<<> >> es manejada por el compilador esencialmente solo escupiendo el código que llama a las llamadas de la API de Driver. Te vincularás a cuda.lib no cudart.lib, y es posible que tengas que lidiar con un programa de "modo mixto" si usas bibliotecas solo de CUDA-RT. –

+1

Ver mi respuesta a su pregunta en mi blog. Spider es correcto. Es poco probable que esto funcione alguna vez correctamente. –

20

Guau, mucho polvo en este hilo. Se me ocurrió una solución macro (bueno, más como solución ...) para esto que pensé que iba a compartir:

// nvcc does not seem to like variadic macros, so we have to define 
// one for each kernel parameter list: 
#ifdef __CUDACC__ 
#define KERNEL_ARGS2(grid, block) <<< grid, block >>> 
#define KERNEL_ARGS3(grid, block, sh_mem) <<< grid, block, sh_mem >>> 
#define KERNEL_ARGS4(grid, block, sh_mem, stream) <<< grid, block, sh_mem, stream >>> 
#else 
#define KERNEL_ARGS2(grid, block) 
#define KERNEL_ARGS3(grid, block, sh_mem) 
#define KERNEL_ARGS4(grid, block, sh_mem, stream) 
#end 

// Now launch your kernel using the appropriate macro: 
kernel KERNEL_ARGS2(dim3(nBlockCount), dim3(nThreadCount)) (param1); 

prefiero este método porque por alguna razón por la que siempre se pierde el '< < <' en mi código, pero la macro recibe ayuda mediante coloreado de sintaxis :).

+4

Esta debería ser la respuesta aceptada – XanderMK

+0

Gracias por su gran solución. Además, no es "#end" sino "#endif" correcto. lo siento por pequeñas cosas pequeñas. –

2

De VS 2015 y CUDA 7 en adelante se puede añadir a estos dos incluye antes que a otros, siempre y cuando los archivos tienen la extensión .cu:

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

No hay necesidad de macros o cualquier cosa. Después, todo funcionará perfectamente.

+1

Seleccione en su lista de errores "solo compilación" para deshacerse de los errores de "espera una expresión" –

+0

No, no funciona. –

Cuestiones relacionadas