1

.cpp流体の流れをモデル化するための粒子法である平滑粒子流体力学を実装するファイルがいくつかあります。

これらの粒子手法で最も時間のかかるコンポーネントの 1 つは、シミュレーションのすべての時間ステップですべての粒子の最近傍 (K 最近傍または範囲検索) を見つけることです。

現在、GPU と CUDA を使用して近隣探索ルーチンを高速化し、現在の CPU ベースの近隣探索ルーチンを置き換えたいと考えています。シミュレーションの残りの部分は CPU で処理されますが、GPU では近隣探索のみが実行されます。

私の質問は、コード全体をコンパイルするにはどうすればよいですか? より具体的には、近隣探索カーネル関数を file に記述したとしますnsearch.cu

次に、以前のすべての ファイルの名前.cppをファイルとして変更し、.cuセット全体を (nsearch.cu と共に) を使用して再コンパイルする必要がありnvccますか? 少なくとも単純な例では、nvccは拡張子を持つ CUDA コードをコンパイルでき.cppません。つまりnvcc foo.cu、コンパイルはしますが、nvcc hello.cppしません。

要するに、この CUDA プラグインの構造はどのようなもので、どのようにコンパイルすればよいのでしょうか?

私はUbuntu Linux 10.10、CUDA 4.0、NVIDIA GTX 570 (コンピューティング機能 2.0)、およびgccコンパイラーを仕事に使用しています。

4

2 に答える 2

2

nsearch.cu ファイルを作成し、「nvcc -c -o nsearch.o」でコンパイルしてから、nsearch.o をメイン アプリケーションにリンクする必要があります。実際のカーネルのラッパーをエクスポートする nsearch.h ファイルが必要です。

in nsearch.h : 
void kern();

in nsearch.cu:
void __global__ kern__() {
}
void kern() {
  kern__<<<...>>>();
}
于 2011-11-22T19:34:22.423 に答える
0

私はあなたと非常によく似た思考プロセスを経てきたので、これはあなたの質問に対するより広い回答です - 私の流体力学的コードを GPU に移動し、他のすべてを CPU に残します。そこから始めるべきだと思いますが、他のすべてのコードも同様に GPU に移行する計画を立てるべきだと思います。私が見つけたのは、GPU はシミュレーションに必要な行列分解を行うのに非常に優れていましたが、GPU と CPU メモリの間のメモリ境界が非常に遅く、GPU シミュレーション時間の 80 ~ 90% が cudaMemcpyDeviceToHost/ で費やされていたことです。 cudaMemcpyHostToDevice.

于 2011-12-05T16:27:54.360 に答える