我刚刚开始进行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为C ++提供了IntelliSense,来自火箭科学家博客的技巧基本上依赖于CUDA-C对C ++的相似性,仅此而已。
在C ++语言中,正确解析尖括号很麻烦。你有<
小于和模板,<<
作为移位,记得不久前我们不得不在嵌套模板声明之间放置一个空格。
所以事实证明,NVIDIA的那个提出这种语法的人不是语言专家,碰巧选择了最差的分隔符,然后将它增加了三倍,好吧,你将遇到麻烦。令人惊讶的是,当Intellisense看到这一点时,它会起作用。
我知道在CUDA中获得完整IntelliSense的唯一方法是从Runtime API切换到Driver 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)
#endif
// Now launch your kernel using the appropriate macro:
kernel KERNEL_ARGS2(dim3(nBlockCount), dim3(nThreadCount)) (param1);
我更喜欢这种方法,因为由于某种原因,我总是在我的代码中丢失'<<<',但宏通过语法着色获得了一些帮助:)。
从VS 2015和CUDA 7开始,如果您的文件具有.cu
扩展名,您可以在其他任何内容之前添加这两个包含:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
不需要MACROS或任何东西。之后一切都会完美运作。