OpenMPプログラミング ..
182:180
09/03/07 23:33:54
(続き)
!$omp parallel num_threads(2) private(myid, i, j, k, alpha)
!$ !myid = OMP_GET_THREAD_NUM()
!$ !write(*,*) '(Number of threads in front of do)=', myid
open(unit=100, file='data.bin', form='unformatted', status='unknown')
!$OMP DO
do k = 1, maxK
do j = 1, NUM
do i = 1, maxI
call RANDOM_NUMBER( alpha )
coeff(j,k) = coeff(j,k) + alpha
!$ !myid = OMP_GET_THREAD_NUM()
!$ !write(*,'(3(A4,I3),A37,I2)') 'k=', k, 'j=',j, 'i=', i, 'Number of threads at the end of do:', myid
end do
coeff(j,k) = coeff(j,k) / maxI
write(100) coeff(j,k)
end do
end do
!$omp master
!$ !myid = OMP_GET_THREAD_NUM()
!$ !write(*,*) '(Number of threads after the do)=', myid
!$omp end master
!$omp end parallel
end program variation
183:デフォルトの名無しさん
09/03/08 14:53:53
gfortranは良くしらんけど・・
環境変数で使うCPUの数を指定してみて。
setenv OMP_THREAD_NUM 2
とか。プログラム内で明示しているからいらない気もするけど、まあ
正確にはマニュアルで確認してね。
あとは、I/O(read,write文)はparallel文の外で
するのが吉。この例だと、open(100,....) と write(100)....は
!$omp end parallel
の後でする。ふつうI/OはプライマリのCPUが単独で担当させる方が安全。
同じファイルに複数のプロセスが書き込みしようとすると
順序の保証が無くなるのであとで使いにくいし、書き込みの順番待ちが
発生するのでのろくなる。
乱数代入のループだけなら1/2になっている可能性大。そうなら
作ったコードは一応OpenMPとして動作している・・・と思う。
184:180
09/03/09 17:16:44
>>183
ありがとうございます。実行シェルは作らず、そのまま
$time ./test_omp.out
という風にやっていました。これから実行シェルを作って見ようと思います。
あと、i/oを外に書いたら、確かに一割ほど速くなりました。
でも、それでも圧倒的にOpenMPは遅いです...
185:180
09/03/09 17:18:47
乱数を使わないプログラムだとOKでした!!
~/test$ /bin/csh ./testOMP_exec.sh
Normal version executing...
2.2u 0.0s 0:02.20 100.4% 0+0k 0+1584io 0pf+0w
OpenMP version executing...
2.1u 0.0s 0:01.14 190.3% 0+0k 0+1584io 0pf+0w
資源使用率190%!!乱数発生器がパラレルに対応していなかったようです。
アドバイス、ありがとうございました。
186:183
09/03/10 04:04:33
あ、そっか
乱数生成って種を使いまわすから、並列のときは最初に疑うべきだったね。
あまり役に立たなかったっぽいけど、
とりあえず、おめでとう。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4361日前に更新/51 KB
担当:undef