タグ

c++とparallelに関するrydotのブックマーク (7)

  • スレッドプールの実装方法について

    スレッドプール(thread pool)を実装するには、暇なときはthreadを寝かせておいて必要なときに起こす、というイベント通知の仕組みが必要になる。 UnixでC/C++で実装するときはpthreadの条件変数を使うのが普通だと思われるが、適当なファイルディスクリプタをopenしておいてread等でブロックさせる方法でも実装できそう。 どのようなやり方が一般的なのか、いくつか有名どころのOSSの実装を調べてみた。 libuvの場合 https://github.com/joyent/libuv 単純にpthread_cond_waitをつかっている 1 static void worker(void* arg) { struct uv__work* w; QUEUE* q; (void) arg; for (;;) { uv_mutex_lock(&mutex); while (QU

  • 新しい並列for構文のご提案

    9. 並列化 powered by C++11 int m = max(thread::hardware_concurrency(), 1u); vector<thread> worker; for (int i = 0; i < m; ++i) { worker.emplace_back([&](int id) { int r0 = N/m * id + min(N%m, id); int r1 = N/m * (id+1) + min(N%m, id+1); for (int j = r0; j < r1; ++j) { process(data[j]); } }, i); } for (auto& t : worker) t.join(); 9 10. 並列化 powered by C++11 int m = max(thread::hardware_concurrency(), 1

    新しい並列for構文のご提案
  • OpenMPとC++例外の危険な関係 - yohhoyの日記

    OpenMP並列化領域内からC++例外を送出する場合、例外を送出したスレッドと同一スレッド上で例外catchを行う必要がある。すなわちOpenMPスレッドをまたぐC++例外伝搬は行われず、またOpenMP並列化領域の中から外へC++例外が送出されてはならない。このルールに反する場合、実行時クラッシュなどを引き起こす可能性がある。 #pragma omp parallel for for (int i = 0; i < 100; i++) { //... throw i; // NG: parallel領域を超えてC++例外が送出される } #include <memory> #include <new> #pragma omp parallel thread_num(2) { try { //... auto = std::make_shared<T>(/*...*/); // ::new

    OpenMPとC++例外の危険な関係 - yohhoyの日記
  • OpenMPでのbreak - 本当は怖いHPC

    2ch「OpenMPプログラミング」スレ304より引用。 OpenMPループ内でのbreakは許可されていないが、自分でループ範囲を決めてフラグを立てることで同じことが可能。 // from http://hibari.2ch.net/test/read.cgi/tech/1102483474/304 #include <stdio.h> #include <omp.h> #define FIN 100 #define TARGET 70 int main(){ int i, found=0, cnt=0; #pragma omp parallel reduction(+:cnt) { int t, n, is, ie; t = omp_get_num_threads(); n = (FIN + t - 1) / t; is = n * omp_get_thread_num(); ie =

    OpenMPでのbreak - 本当は怖いHPC
  • How to: Convert an OpenMP Loop that Uses Cancellation to Use the Concurrency Runtime

    Some parallel loops do not require that all iterations be executed. For example, an algorithm that searches for a value can terminate after the value is found. OpenMP does not provide a mechanism to break out of a parallel loop. However, you can use a Boolean value, or flag, to enable an iteration of the loop to indicate that the solution has been found. The Concurrency Runtime provides functional

    How to: Convert an OpenMP Loop that Uses Cancellation to Use the Concurrency Runtime
  • インテル® コンパイラーOpenMP* 入門.pdf

    ® OpenMP* / 1 ® OpenMP* 1 1 1 ......................................................................... 2 2 ........................ 3 3 ....................................................... 5 4 ............................... 7 5 ............................ 9 5.1 ........................................................................ 9 5.2 OpenMP* API ............................ 13 6 .......

  • OpenMPの使い方:tech.ckme.co.jp

    OpenMPは複数のCPU(複数コアを含む)を持った計算機上での並列化に威力を発揮する。 OpenMPを使う最大の利点は、OpenMPに対応したコンパイラであれば、非常に簡単に並列化できる点である。 現在、gcc、Visual C++、およびIntelコンパイラなど主要なコンパイラはOpenMPに対応している。 習得も他の並列化技法に比べて比較的容易である。 なお、速度を最優先にする場合、単一コンピュータ上で動かした場合でも、メモリのローカリティのためかOpenMPよりMPIの方が効率のよいことが多い。MPIに関してはこちらを参照。 なお、インテルがOpenMP初心者向けに非常にわかりやすい文書を公開している。 OpenMPプログラムのコンパイル OpenMPの各種関数を使わない場合、#pragma ompで始まる指示をソースコード内に書き込み、下記のコンパイルスイッチをつけてコンパイルす

  • 1