Fortran-OpenMPと割り当て可能な配列に関する質問があります。それは簡単です:スペースはどこに割り当てられますか?私のようなものがある場合Fortran OpenMPはどこに配置されますか
!$omp parallel default(shared) private(arr)
!$omp critical
allocate(arr(BIGNUMBER))
!$omp end critical
!do calculations with many arr accesses
!$omp critical
deallocate(arr)
!$omp end critical
!$omp end parallel
スペースはスタックまたはヒープに割り当てられますか?それは、ヒープ上にある場合は、上記のコードと最初のコードでは、この
allocate(arr(BIGNUMBER, nThread))
!$omp parallel default(shared) private(localArr)
iThread = omp_get_thread_num()
localArr => arr(:, iThread)
!do calculations with many localArr accesses
!$omp end parallel
deallocate(arr)
- のようなものとの間に差がある、2つの重要な領域が存在します。彼らは実行を遅くし、うまくスケールしないと私は仮定します。 (私は実際には、割り振りがスレッドセーブであるため、それらを残しておくことができないのかどうかは実際は分かりません)。しかし、配列がスタックに割り当てられていれば、高速アクセスのために高速になるはずです。
- 2番目のコードでは、配列がヒープ上にあることを確認していますが、これはアクセスが遅くなります。しかし、最初のコードの配列がヒープ上にも割り当てられていれば、クリティカルな試薬を保存します+それはただ1つの割り当て/割り当て解除です。速いはずですか?
- 配列のサイズはこれに任意のロールですか?
- ヒープ上に割り当てられる場合は、スタックに強制的に割り当てる方法がありますか?
短い質問は基本的に問題の最適解と思われるでしょうか?
'localArr => arr ...'を実行できますが、これは 'arr'がスレッド間で共有されていることを意味します。私はあなたがそれを望んでいないと思う。 'localArr'ポインタは各スレッドのコピーを持ちますが、指された内容は共有されます。あるスレッドの配列内容への変更は、他のスレッドに反映されます。 – Jason