0

複数のスレッドを利用するC++で作成したコードがいくつかあります。

私は配列を廃止し、プログラムをそのように合計することができます(複数の実行にわたって複数のスレッドで実行)、つまり-1 /+1乱数の合計

runningTotal += ((rng_1.rand_cmwc()%range + 1) <= halfRange ? 1: -1);

rng_1.rand_cmwc()はcmwcクラスの関数を参照し、rng_1はオブジェクトです。

OpenCl(http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201)でいくつか読んだことがあります。ライブラリをセットアップし、自分のホストをコンパイルしました。

それは私を質問#1に導きます

このクラスはOpenCLに存在しないので、このクラスを保持するためだけにカーネルを作成する必要があると思います。

変数:

runningTotalは長いです

範囲は一定の長さです

halfRangeはconstlong(つまり、range / 2)です

私の2番目の質問はです。

これは配列ではないため(ほとんどのOpenCLチュートリアルでは、OpenCLに配列内の複数の要素を同時に割り当てる方法について説明しています)。

セットアップ方法

  runningTotal += ((rng_1.rand_cmwc()%range + 1) <= halfRange ? 1: -1);

複数のコアで実行するには?ワークグループを行いますか?

複数のカーネルを参照するcl_programclCreateProgramWithSourceコマンドを実行する方法の例を誰かに教えてもらえますか?

もっと質問があると思いますが、2つのカーネルが必要になると思います。それぞれが独自のワークグループを実行していますか?1つはcmwcクラス用で、もう1つはrunningTotalの合計用です。

次に、どういうわけか、すべての作業項目を頻繁に同期して、より大きな合計にします。

4

1 に答える 1

1

最初の質問: 静的 C++ カーネル言語 ( http://developer.amd.com/Assets/CPP_kernel_language.pdfを参照)と呼ばれる拡張機能を使用して、AMD だけがカーネルでのクラスの使用をサポートしていると思います。

2 番目の質問: 合計を並列に実行するには、プレフィックス合計 (http://en.wikipedia.org/wiki/Prefix_sum) やリダクション (http://developer.amd.com/Resources) などの並列合計アルゴリズムを使用する必要があります。 /documentation/articles/Pages/OpenCL-Optimization-Case-Study-Simple-Reductions.aspx)。このためのライブラリが存在することに注意してください。

それが役立つことを願っています。幸運を :)

于 2012-10-25T15:07:35.153 に答える