Настройка VS 2010 Intellisense для вызовов ядра CUDA - PullRequest
17 голосов
/ 19 мая 2011

Я только начал программировать на 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;
}

Строка ядра <<< 1,1 >>> () подчеркнута красным, в частности, одной стрелкой слевапервого с ошибкой, читающей «Ошибка: ожидаемое и выражение».Однако, если я наведу курсор мыши на функцию, ее тип и параметры будут отображаться правильно.Он по-прежнему прекрасно компилируется, мне просто интересно, как избавиться от этого маленького раздражения.

Ответы [ 3 ]

25 голосов
/ 16 января 2015

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

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

Я предпочитаю этот метод, потому что по какой-то причине я всегда теряю «<<<» в моем коде, но макрос получает некоторую помощь через окрашивание синтаксиса:). </p>

12 голосов
/ 20 мая 2011

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

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

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

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

7 голосов
/ 01 марта 2017

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

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

Нет необходимости в MACROS или чем-либо еще. После этого все будет отлично работать.

...