Настройка VS 2010 Intellisense для вызовов ядра CUDA

Я только что начал Программирование CUDA, и все идет довольно хорошо, мои графические процессоры распознаются и все такое. Я частично настроил Intellisense в Visual Studio, используя это чрезвычайно полезное руководство ЗДЕСЬ: http://www.ademiller.com/blogs/tech/2010/10/visual-studio-2010-adding-intellisense-support-for-cuda-c/

и здесь: http://www.ademiller.com/blogs/tech/2011/05/visual-studio-2010-and-cuda-easier-with-rc2/

однако Intellisense по-прежнему не реагирует на вызовы ядра следующим образом:

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

строка kernel>>() подчеркнута красным цветом, в частности одна стрелка слева от первый с ошибкой "Error: expected and expression". Однако, если я наведу указатель мыши на функцию, ее возвращаемый тип и параметры отображаются правильно. Он все еще компилируется просто отлично, мне просто интересно, как избавиться от этого маленького раздражения.

3 ответов


Visual Studio предоставляет IntelliSense для C++, трюк из блога rocket scientist в основном полагается на сходство CUDA-C С C++, не более того.

в языке C++ правильный синтаксический анализ угловых скобок является хлопотным. У тебя есть < меньше чем и для шаблонов, и << как shift, помните, не так давно, когда мы должны были поместить пробел между вложенными объявлениями шаблона.

Так получается, что парень из NVIDIA, который придумал этот синтаксис не был специалистом по языку, и случайно выбрал худший из возможных разделителей, затем утроил его, Ну, у вас будут проблемы. Удивительно, что Intellisense вообще работает, когда видит это.

единственный способ, которым я знаю, чтобы получить полный IntelliSense в CUDA, это переключиться с API среды выполнения на API драйвера. C++ - это просто C++, а CUDA по-прежнему (вроде) C++, нет <<<>>> плохость для парсинга языка придется обойти.


Вау, много пыли на этой ветке. Я придумал исправление макроса (ну, больше похоже на обходной путь...) за это я думал, что поделюсь:

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

Я предпочитаю этот метод, потому что по какой-то причине я всегда теряю "


от VS 2015 и CUDA 7 и далее вы можете добавить эти два включает в себя перед любыми другими, при условии, что ваши файлы имеют