Konfigurowanie programu Visual Studio Intellisense dla połączeń jądra CUDA

Właśnie zacząłem programowanie CUDA i idzie całkiem nieźle, moje GPU są rozpoznawane i w ogóle. Częściowo skonfigurowałem Intellisense w Visual Studio, korzystając z tego niezwykle pomocnego przewodnika: http://www.ademiller.com/blogs/tech/2010/10/visual-studio-2010-adding-intellisense-support-for-cuda-c/

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

Jednak Intellisense nadal nie odbiera takich wywołań jądra:

// 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;
}

Jądro linii > > () jest podkreślone na czerwono, a konkretnie jedna strzałka na lewo od pierwszej z błędem odczyt "Error: expected and expression". Jeśli jednak najadę na funkcję, jej typ i parametry zostaną wyświetlone poprawnie. Nadal dobrze się komponuje, zastanawiam się tylko, jak pozbyć się tej małej irytacji.

Author: Robert Crovella, 2011-05-19

5 answers

Visual Studio dostarcza IntelliSense dla C++, sztuczka z bloga rocket scientist polega w zasadzie na podobieństwie CUDA-C do C++, nic więcej.

W języku C++ prawidłowe parsowanie nawiasów kątowych jest kłopotliwe. Masz < jako mniej niż i dla szablonów, oraz << jako shift, pamiętaj nie tak dawno, kiedy musieliśmy wstawić spację pomiędzy zagnieżdżonymi deklaracjami szablonów.

Okazuje się więc, że facet z Nvidii, który wymyślił tę składnię, nie był ekspert językowy, i zdarzyło się wybrać najgorszy możliwy ogranicznik, a następnie potroić go, cóż, będziesz miał kłopoty. To niesamowite, że Intellisense w ogóle działa, gdy to widzi.

Jedynym sposobem, jaki znam, aby uzyskać pełny IntelliSense w CUDA, jest przejście z interfejsu Runtime API do interfejsu Driver API. C++ jest po prostu C++, A CUDA jest nadal (swego rodzaju) C++, nie ma <<<>>> zła, aby parsowanie języka musiało działać.

 20
Author: Brian Kretzler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-01 12:21:35

Wow, dużo kurzu na tym wątku. Wymyśliłem poprawkę makro (cóż, bardziej obejście...) za to, że myślałem, że się podzielę:

// 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)
#endif

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

Wolę tę metodę, ponieważ z jakiegoś powodu zawsze tracę '

 36
Author: Randy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-02 20:53:27

Począwszy od VS 2015 i CUDA 7 możesz dodać te dwa obejmuje przed innymi, pod warunkiem, że Twoje pliki mają rozszerzenie .cu:

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

Nie ma potrzeby tworzenia makr. Potem wszystko będzie działać idealnie.

 8
Author: Nikos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-01 14:08:20

I LOVEDRandy 'Ssolution . Dopasuję i podbijam używając makr variadic preprocesora C:

#ifdef __INTELLISENSE__
#define CUDA_KERNEL(...)
#else
#define CUDA_KERNEL(...) <<< __VA_ARGS__ >>>
#endif

Przykłady użycia:

my_kernel1 CUDA_KERNEL(NUM_BLOCKS, BLOCK_WIDTH)();
my_kernel2 CUDA_KERNEL(NUM_BLOCKS, BLOCK_WIDTH, SHMEM, STREAM)(param1, param2);
 1
Author: Nir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-25 04:50:50

Uczyłem się CUDA i napotkałem dokładnie ten problem. Jak powiedzieli inni, to po prostu problem Intellisense i można go zignorować, ale znalazłem czyste rozwiązanie, które faktycznie go usuwa.

Wygląda na to, że > > jest interpretowany jako poprawny kod, jeśli znajduje się wewnątrz funkcji szablonu.

Odkryłem to przypadkowo, kiedy chciałem stworzyć wrappery dla jąder, aby móc je wywoływać ze zwykłego kodu cpp. Jest zarówno ładną abstrakcją, jak i usuwa składnię błąd.

Plik nagłówkowy Jądra (np. kernel.cuh)

const size_t THREADS_IN_BLOCK = 1024;

typedef double numeric_t;

// sample kernel function headers
__global__ void sumKernel(numeric_t* out, numeric_t* f, numeric_t* blockSum, size_t N);
__global__ void expKernel(numeric_t* out, numeric_t* in, size_t N);
// ..

// strong-typed wrapper for a kernel with 4 arguments
template <typename T1, typename T2, typename T3, typename T4>
void runKernel(void (*fun)(T1, T2, T3, T4), int Blocks, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { 
    fun <<<Blocks, THREADS_IN_BLOCK >>> (arg1, arg2, arg3, arg4);
}

// strong-typed wrapper for a kernel with 3 arguments
template <typename T1, typename T2, typename T3>
void runKernel(void (*fun)(T1, T2, T3), int Blocks, T1 arg1, T2 arg2, T3 arg3) { 
    fun <<<Blocks, THREADS_IN_BLOCK >>> (arg1, arg2, arg3);
}

// ...

// the one-argument fun cannot have implementation here
void runKernel(void (*fun)(), int Blocks);

W pliku. cu (tutaj pojawi się błąd składni, ale czy kiedykolwiek potrzebujesz funkcji jądra bez parametrów? jeśli nie, to i odpowiedni nagłówek można usunąć):

void runKernel(void (*fun)(), int Blocks) { 
    fun <<<Blocks, THREADS_IN_BLOCK >>> ();
}

Użycie w a .plik cpp:

runKernel(kernelFunctionName, arg1, arg2, arg3);
// for example runKernel(expKernel, B, output, input, size);
 -1
Author: Lutosław,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-16 11:20:07