問題タブ [openmp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - time_t変数を浮動小数点数としてprintfする方法は?
C(openMP環境)でtime_t変数を使用してCPUの実行時間を維持しています...すべてのCPUの時間を合計するためにfloat値sum_tot_timeを定義しています...つまり、sum_tot_timeはCPUのtime_t値の合計です。問題は、値sum_tot_timeを整数またはlongとして出力することです。ちなみに、小数部はありません。
私はこれらの方法で試しました:
- double値としてdoubleとしてsum_tot_timeをprintfする
- float値であるfloatとしてfsum_tot_timeをprintfする
- xをtime_t値としてdoubleとしてprintfsum_tot_timeする
- time_t値であるfloatとしてfsum_tot_timeをprintfする
openmp - OpenMP - 物事を並行して実行し、いくつかをその中で順番に実行する
次のようなシナリオがあります。
これがブロック A であると考えると、私のコードにはさらに 2 つの同様のブロックがあります。並列にしたいので、OpenMPプラグマを使いました。ただし、この場合、どの変数が共有され、プライベートになるかについて少し混乱しているため、並列化することはできません。内側のループでの関数呼び出しが sum += x のような演算である場合、削減句を追加できたはずです。一般に、入れ子になった for ループがあり、メインの操作を行う別の内部 for ループがある場合、OpenMP を使用してコードを並列化するアプローチはどのようになるでしょうか。並列領域を宣言してから、単純にプラグマ fors をブロックの前に置いてみましたが、間違いなくそこにポイントがありません!
ありがとう、サヤン
for-loop - :OpenMPのomp並列内のセクションの分割
私は次のような状況にあります:
#pragma omp parallel for private(i, j, k, val, p, l)
読んでくれてありがとう、おい!シリアル実装に対して上記(3倍高速)を使用すると、結果にごくわずかな違い(0.999967[omp]と1[シリアル])が異なることに気づきました。今、私はここで間違いをしていることを知っています...特にループ間の関係は明らかです。ompセクションを使用してこれを並列化することは可能ですか?shared(p)を作成するなどのいくつかのオプションを試しましたが、{これを行うと、シリアル形式のように正しい値が得られました}が、そのときは高速化されませんでした。
多数のforループでopenmpプラグマを処理するための一般的なアドバイスも、私にとっては素晴らしいことです。
multithreading - OpenMP スレッド プールの競合に対処する方法
粗いマルチスレッドと細かいマルチスレッドの両方を使用するアプリケーションに取り組んでいます。つまり、スレッドのプールで大きなワーク ユニットのスケジューリングを手動で管理し、それらのワーク ユニット内で、特定の機能が OpenMP を利用してより細かいマルチスレッド化を実現します。
最もコストのかかるループで OpenMP を選択的に使用することで利益を実現しましたが、安価なループに OpenMP ブロックを追加する際に OpenMP ワーカー プールの競合が発生することを懸念しています。コードのブロックが利用可能な場合はプールを使用し、そうでない場合はループをシリアルに処理する必要があることをOpenMPに通知する方法はありますか?
c++ - STLコンテナをロックするための「アトミックディレクティブ」の適切な使用
私は多数の整数のセットを持っており、それらをポインターのベクトルに入れています。競合状態を引き起こすことなく、これらの整数のセットを並行して更新できる必要があります。すなわち。私はOpenMPの「parallelfor」構造を使用しています。
共有リソースを処理するために、OpenMPは便利な「アトミックディレクティブ」を提供します。これにより、ロックを使用せずに特定のメモリの競合状態を回避できます。「アトミックディレクティブ」を使用して整数セットが同時に更新されないようにすると便利ですが、これが可能かどうかはわかりません。
基本的に、次のコードが競合状態につながる可能性があるかどうかを知りたいです
私のアプリケーションでは、任意のスレッドが任意のインデックスにアクセスする可能性があるため、インデックスにランダムな整数を使用していることに注意してください(大きなアプリケーションにはランダムな要素がありますが、詳細に立ち入る必要はありません)。
整数をインクリメントするためのこれと同様の例を見てきましたが、私の場合のようにコンテナーへのポインターを操作するときに機能するかどうかはわかりません。
multithreading - OpenMP を使用した無駄な printf による高速化なし
単純な for ループを並列化する最初の OpenMP プログラムを作成しました。デュアル コア マシンでコードを実行したところ、1 スレッドから 2 スレッドに移行すると速度が向上しました。ただし、学校の Linux サーバーで同じコードを実行したところ、速度が向上しませんでした。さまざまなことを試した後、役に立たない printf ステートメントをいくつか削除すると、コードの速度が大幅に向上することに最終的に気付きました。以下は、私が並列化したコードの主要部分です。
printf の実装には、OpenMP が各スレッドで複製しなければならない大きなオーバーヘッドがあると思います。このオーバーヘッドの原因は何ですか? OpenMP がそれを克服できないのはなぜですか?
visual-studio-2008 - VC++ 2008、2010 での OpenMP 実装
実装にもよりますが、OMP はかなり任意のコードを並列化するのに非常に役立ちます (たとえば、2 つの独立したメソッドを呼び出すメソッド内の並列セクション)。スレッドの作成/キャッシュ方法に依存すると思います。
VC++ 2008 の実装はどのように機能しますか? 2010 年の実装は、機能とパフォーマンス/柔軟性の点で大きく異なりますか?
c++ - mexのopenmp:stackoverflowエラー
私はスタックオーバーフローエラーを取得する次のコードの一部を取得しました
共有で宣言された変数は、malloc によって作成されます。そしてそれらは大量のメモリを消費します
上記のコードに関して 2 つの質問があります。1) 並列 for ループに入る前にスタック オーバーフロー エラー (セグメンテーション違反) が発生するのはなぜですか? シーケンシャル モードで実行すると問題なく動作します.... 2) 上記の「normalized_p_gn」のように各スレッドにメモリを動的に割り当てる権利がありますか?
よろしくエドウィン
openmp - OpenMP ディストリビューションの SECTIONS ディレクティブはどのように機能しますか?
OpenMP で を使用する場合、スレッドはセクションomp sections
内のブロックに分散されますか、それともセクションごとに各スレッドが割り当てられますか?
時期nthreads == 3
:
出力:
しかし、次のコードを実行すると:
出力:
これらの出力から、OpenMP におけるセクションの概念が何であるかを理解できません。
c++ - 署名されていない OpenMP インデックス変数が許可されないのはなぜですか?
C++/OpenMP コードに次のようなループがあります。
(Visual Studio 2005 で) コンパイルすると、次のエラーが発生します。
error C3016: 'i' : index variable in OpenMP 'for' statement must have signed integral type
i
が署名ではなく未署名であるためにエラーが発生することを理解しており、署名済みに変更i
するとこのエラーが解消されました。私が知りたいのは、なぜこれがエラーなのかということです。符号なしのインデックス変数が許可されないのはなぜですか? このエラーのMSDNページを見ると、何の手がかりも得られません。