为CUDA内核调用设置VS 2010 Intellisense

sj7*_*755 19 intellisense cuda visual-studio-2010 gpu-programming

我刚刚开始进行CUDA编程,而且它的功能非常好,我的GPU已经被认可了.我在这里使用这个非常有用的指南在Visual Studio中部分设置了Intellisense: 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;
}
Run Code Online (Sandbox Code Playgroud)

行内核<<< 1,1 >>>()用红色下划线,特别是第一个左边的一个箭头,错误读数为"Error:expected and expression".但是,如果我将鼠标悬停在该函数上,则会正确显示其返回类型和参数.它仍然编译得很好,我只是想知道如何摆脱这个小烦恼.

小智 28

哇,这个帖子上有很多灰尘.我提出了一个宏修复(好吧,更像是解决方法......),我想我会分享:

// 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); 
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种方法,因为由于某种原因,我总是在我的代码中丢失'<<<',但宏通过语法着色获得了一些帮助:).

  • 似乎`__INTELLISENSE__` 比`__CUDACC__` 更安全,检查/sf/answers/432749621/ 和https://devtalk.nvidia.com/default/topic/513485/cuda-programming-and-性能/__syncthreads-is-undefined-need-a-help/ (3认同)

Bri*_*ler 13

Visual Studio为C++提供了IntelliSense,来自火箭科学家博客的技巧基本上依赖于CUDA-C对C++的相似性,仅此而已.

在C++语言中,正确解析尖括号很麻烦.你已经得到了<和模板一样少的东西,并且<<作为移位,记得不久前我们不得不在嵌套模板声明之间放置一个空格.

所以事实证明,NVIDIA的那个提出这种语法的人不是语言专家,碰巧选择了最差的分隔符,然后将它增加了三倍,好吧,你将遇到麻烦.令人惊讶的是,当Intellisense看到这一点时,它会起作用.

我知道在CUDA中获得完整IntelliSense的唯一方法是从Runtime API切换到Driver API.C++只是C++,而CUDA仍然是(有点)C++,<<<>>>语言解析不需要解决.

  • 我必须说,你比 NVIDIA 论坛上的任何人都更有道理......那么我该如何去做你刚刚说的呢? (4认同)

Nik*_*kos 7

从VS 2015和CUDA 7开始,您可以在其他任何内容之前添加这两个包含,只要您的文件具有.cu扩展名:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
Run Code Online (Sandbox Code Playgroud)

不需要MACROS或任何东西.之后一切都会完美运作.

  • 在 VS2019 Community 上,添加这些行似乎对我也不起作用。@BartDeBoeck 这只是过滤错误列表,而不是突出显示。 (2认同)