- ベストアンサー
並列処理(SCore)とは?
- 初心者がSCOREを用いて並列処理を行う方法について説明します。
- 4つのPCで1ノードずつを並列接続した場合の演算性能の向上について質問します。
- プログラムによって演算性能の向上の度合いが異なる可能性があるか質問します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1さんに追加補足 質問1、2: 同じデータ並列ですが、実行環境が違うことと、ひとつのプロセスですべてのコアを占有する thread はコアを2個使えば2倍、3個使えば3倍それぞれ速くはならない。一方、PCを組み合わせて使う場合、それは完全に独立しており、データ並列のために分割されて計算量が縮小された分、PC組み合わせ数にほぼ比例して速くなる。その違いです。 ↓に簡単な円周率の threadプログラムを示しますから、「THREAD_NUM」を1~4に変えて体験してください。 /* Simple sircular constant program by thread on Mac OSX * file name: qwe.c * compile: gcc qwe.c -lpthread * execution: ./a.out */ #include <stdio.h> #include <sys/time.h> #include <pthread.h> // gcc #define THREAD_NUM 3 #define TIMES 1000000000 typedef struct _thread_arg { int id; double *sum; } thread_arg_t; void thread_func(void *arg) { thread_arg_t* targ = (thread_arg_t *)arg; long c_start, c_end, range; long i; double x, pi, step, *temp_idsum; range = (double)TIMES / (double)THREAD_NUM; c_start = 1 + targ->id * range; if (targ->id > 0) c_start += 1; c_end = 1 + (targ->id + 1) * range; if (c_end > TIMES) c_end = TIMES; temp_idsum = targ->sum; step = 1.0 / (double)TIMES; for (i = c_start; i <= c_end; i++) { x = (i - 0.5) * step; *temp_idsum += 4.0 / (1.0 + x * x); } } int main(void) { pthread_t handle[THREAD_NUM]; thread_arg_t targ[THREAD_NUM]; double sums[THREAD_NUM], total_sum, pi; long i; struct timeval tv; struct timezone tz; double before, after; for (i = 0; i < THREAD_NUM; i++) sums[i] = 0.0; printf("program running: "); fflush(stdout); gettimeofday(&tv, &tz); before = (double)tv.tv_sec + (double)tv.tv_usec * 1.0e-6; for (i = 0; i < THREAD_NUM; i++) { targ[i].id = i; targ[i].sum = &sums[i]; pthread_create(&handle[i], NULL, (void *)thread_func, (void *)&targ[i]); } for (i = 0; i < THREAD_NUM; i++) pthread_join(handle[i], NULL); total_sum = 0.0; for (i = 0; i < THREAD_NUM; i++) total_sum += sums[i]; pi = total_sum / TIMES; gettimeofday(&tv, &tz); after = (double)tv.tv_sec + (double)tv.tv_usec * 1.0e-6; fprintf(stderr, "%.3f sec\n", after - before); printf("\tpi = %.11f\n", pi); return 0; }
その他の回答 (1)
- Yanch
- ベストアンサー率50% (114/225)
●PC数が多い方が演算性能が優れているのはなぜ? > [質問?] > たとえば、1つのPCで、4ノードで並列処理を行った場合と、 > 4つのPCで各1ノードずつ、合計4ノードで並列処理を行った場合に、 > 4PCで1ノードずつを並列接続したほうが"約1.8倍"の演算性能を誇っているのはなぜでしょうか? 実行結果の図を見たところ、スレッド切り替えのオーバーヘッドが影響してい るのではないかと、思われます。 数字とにらめっこしているだけではわかりにくいと思いますので、 色々な方法でグラフ化してみてると、傾向がつかみやすいかと思います。 ●どのようなプログラムならノード数が同じ時に、同じ演算性能になるのか? > [質問?] > 今回は初期値を設定して、ラプラス方程式を解く逐次プログラムを使用しましたが、 > プログラムによっては、質問?のような結果にならない場合もあるのでしょうか? > もしあるなら、どのようなタイプのプログラムなら、1台で4ノード、4台で4ノードの演算性能がほとんど同じ程度になるのでしょうか? スレッド切り替えのオーバーヘッドが影響するのが、演算性能低下の理由であ るとすれば、プログラムの種類にかかわらず、同じような処理結果の傾向にな ると予想されます。 ●補足 並列処理時に、1台のPCでも、複数のプロセッサを搭載していれば、スレッド 切り替えのオーバーヘッドが発生しないと思うかもしれませんが、実際のところ、 スレッドが取り扱うリソースはCPU以外にも存在しますので、スレッド切り替 えのオーバーヘッドが0にはなりません。
補足
質問者です。 >ひとつのプロセスですべてのコアを占有するスレッド とはどういうことでしょうか?初歩的な質問ですいません。