web-dev-qa-db-ja.com

CUDAカーネル呼び出し用のVisualStudioIntellisenseのセットアップ

私は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 >>>()の行には赤の下線が引かれています。具体的には、最初の矢印の左側にある1つの矢印で、「エラー:予期された式」というエラーが表示されます。ただし、関数にカーソルを合わせると、戻り値の型とパラメーターが正しく表示されます。それでも問題なくコンパイルされます。この小さな煩わしさを取り除く方法を考えています。

23
sj755

VisualStudioはIntelliSensefor C++を提供します。ロケット科学者のブログのトリックは、基本的にCUDA-CがC++と類似していることに依存しています。

C++言語では、山かっこを適切に解析するのは面倒です。テンプレートの場合は<未満、シフトの場合は<<があります。少し前に、ネストされたテンプレート宣言の間にスペースを入れなければならなかったことを思い出してください。

したがって、この構文を思いついたNVIDIAの人は言語の専門家ではなく、たまたま最悪の区切り文字を選択し、それを3倍にしたことがわかりました。まあ、問題が発生するでしょう。これを見ると、Intellisenseがまったく機能するのは驚くべきことです。

CUDAで完全なIntelliSenseを取得するために私が知っている唯一の方法は、ランタイムAPIからドライバーAPIに切り替えることです。 C++は単なるC++であり、CUDAはまだ(一種の)C++であり、言語解析が回避しなければならないという<<<>>>の悪さはありません。

15
Brian Kretzler

うわー、このスレッドにはたくさんのほこりがあります。私はこれについてマクロ修正(まあ、回避策のようなもの...)を思いついたので、共有したいと思いました:

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

何らかの理由でコード内の '<<<'が常に失われるため、この方法を好みますが、マクロは構文の色付けによって助けを得ます:)。

30
Randy

VS2015およびCUDA7以降、ファイルの拡張子が.cuの場合、これら2つのインクルードを他のインクルードの前に追加できます。

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

MACROSなどは必要ありません。その後、すべてが完全に機能します。

7
Nikos