为CUDA内核调用设置VS 2010 Intellisense

问题描述 投票:16回答:3

我刚刚开始进行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;
}

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

visual-studio-2010 cuda intellisense gpu-programming
3个回答
13
投票

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

在C ++语言中,正确解析尖括号很麻烦。你有<小于和模板,<<作为移位,记得不久前我们不得不在嵌套模板声明之间放置一个空格。

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

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


25
投票

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

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

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


7
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.