2011-05-19 78 views
14

我剛剛開始CUDA編程,它的運行非常好,我的GPU已被識別, http://www.ademiller.com/blogs/tech/2010/10/visual-studio-2010-adding-intellisense-support-for-cuda-c/爲CUDA內核調用設置VS 2010智能感知

在這裏:我一直在使用這種極其有益的指導,在這裏進行部分設置智能感知在Visual Studio http://www.ademiller.com/blogs/tech/2011/05/visual-studio-2010-and-cuda-easier-with-rc2/

但是,智能感知仍然沒有拿起內核調用是這樣的:

// 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」。但是,如果我將鼠標懸停在該函數上,則其返回類型和參數將正確顯示。它仍然編譯得很好,我只是想知道如何擺脫這個小小的煩惱。

回答

11

Visual Studio爲C++提供了IntelliSense,來自火箭科學家的博客的技巧基本上依賴於CUDA-C對C++的相似性,僅此而已。

在C++語言中,正確解析尖括號是很麻煩的。你有<小於模板,<<作爲轉變,記得不久前,當我們必須在嵌套的模板聲明之間放置一個空間。

因此,事實證明,NVIDIA提出這種語法的人不是語言專家,碰巧選擇了最差的可能分隔符,然後將其翻了三倍,那麼您將遇到麻煩。 Intellisense在看到這件事時完全可以工作,這真是太神奇了。

我知道在CUDA中獲得完整智能感知的唯一方法是從運行時API切換到驅動程序API。 C++只是C++,而CUDA仍然是(有點)C++,語言解析不需要解決不好。

+1

我必須說,你比NVIDIA論壇上的任何人都更有意義......那麼,我該如何去做你剛剛說的話呢? – sj755 2011-05-20 04:05:10

+1

查看matrixMul和matrixMulDrv的區別。 <<<> >>語法由編譯器處理,基本上只是吐出調用Driver API調用的代碼。您將鏈接到cuda.lib而不是cudart.lib,如果您使用僅CUDA-RT庫,則可能需要處理「混合模式」程序。 – 2011-05-20 14:41:42

+1

請在我的博客上查看我對您的問題的回覆。蜘蛛是正確的。這不太可能會正常工作。 – 2011-05-20 14:53:00

20

哇,這個線程上有很多灰塵。我想出了一個宏修復(當然,更喜歡的解決辦法...)這個,我想我也有同感:

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

我喜歡這種方法,因爲某種原因,我總是失去「< < <」在我的代碼中,但宏通過語法着色:)獲得一些幫助。

+4

這應該是被接受的答案 – XanderMK 2015-02-07 21:50:37

+0

感謝您的出色解決方案。另外,不是「#end」而是「#endif」是正確的。對於小小的事情感到抱歉。 – 2017-12-08 22:06:33

2

從2015年VS和CUDA 7起,可以添加這兩個包括任何在別人面前,只要你的文件有.cu擴展:

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

無需宏或任何東西。之後,一切都將完美運作。

+1

在您的錯誤列表中選擇「build only」以擺脫「預期的表達式」錯誤 – 2017-04-16 18:54:34

+0

不,不工作。 – 2017-06-03 03:20:20