2

単純な数値解析コード(台形公式の数値積分)を、CUDA対応のGPUで実行できるものに変換しようとしています。そこにはたくさんの文献がありますが、それはすべて、ここで必要とされるものよりもはるかに複雑に思えます!私の現在のコードは次のとおりです。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define N 1000

double function(double);

int main(void)
{
   int i;
   double lower_bound, upper_bound, h, ans;

   printf("Please enter the lower and upper bounds: ");
   scanf(" %lf %lf", &lower_bound, &upper_bound);
   h = (upper - lower) / N;
   ans = (function(lower) + function(upper)) / 2.0;
   for (i = 1; i < N; ++i) {
      ans += function(i * h);
   }
   printf("The integral is: %.20lf\n", h * ans));

   return 0;
}

double function(double x)
{
   return sin(x);
}

これは、Nが非常に大きくなるまでうまく機能します。私はより高速なopenMPを使用して実装を行いましたが、CUDAについても少し知っておくと便利だと思います。どこから始めればいいのか、このコードを簡単に変換する方法があるのか​​、誰か提案がありますか?どうもありがとう、ジャック。

4

3 に答える 3

1

並列スレッドに分散する必要があるのはループです。各スレッドの一意のインデックスを計算できます (idx = 0...N-1)。各スレッドは、積分の個々の部分を計算し、その答えを共通配列 (intgrl[idx]) 内のその位置に格納するだけです。次に、並列スキャンまたは収集と呼ばれる手順を使用してすべてを合計します。NVIDIA cuda の例に例があります。最も簡単な方法は、Thrust ライブラリを使用することです。「これらの値を合計する」と指示するだけで、最速の方法が計算されます。

于 2011-01-26T08:23:56.267 に答える
0

乗算を取り除くことができます:D

   double nomul = h;
   for (i = 1; i < N; ++i) {
      ans += function(nomul);
      nomul += h;
   }
于 2010-09-25T17:43:12.940 に答える
-2

まず、コンピューターに CUDA をインストールします。その後、SDK で利用可能ないくつかの例を実行してみてください。一見すると少し複雑に見えるかもしれませんが、Web 上には CUDA の「Hello World」の例がたくさんありますのでご安心ください。

より手の込んだものを探している場合は、このプロジェクトをコンパイルしてみてください(OpenCV をインストールする必要があります)。これにより、画像がグレースケール表現に変換されます ( Windows/Linux/Mac OS Xでコンパイルするファイルがあるため、プロジェクトをコンパイルするのに助けが必要な場合は、一見の価値があります)。

于 2010-09-25T17:53:36.737 に答える