OpenMPプログラミング

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
NGNG
オフィシャルサイト
http://www.openmp.org/

リンクなどは>>2以下で
251デフォルトの名無しさん
垢版 |
2009/10/07(水) 04:35:58
>>250
gotoを取り除く
2009/10/10(土) 03:19:26
んだ。gotoあると並列処理されにくいよ。
並列化してると、途中で終了するのも最後までやるのも計算コストはかわらんし。
マスクの部分は
if((p=getPoint()) /= N){ごにょ} か if((p=getPoint()) < N){ごにょ}
にする・・・とかかな。
253デフォルトの名無しさん
垢版 |
2009/10/29(木) 11:34:56



岡田外務大臣キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
h‍ttp‍:‍/‍/‍q‍b5.2‍ch.net/t‍est/rea‍d.cgi‍/sak‍u2ch/1256‍630318/1



早く記念カキコしないと埋まっちゃうwww
2009/11/21(土) 02:59:22
OpenMPでスレッド間の1対1通信ってどうやんの
2009/11/23(月) 17:05:30
>>250 >>251
返事遅れてごめん。ありがとう。
2009/11/23(月) 17:07:10
>>252
なるほど。ありがとう。
257デフォルトの名無しさん
垢版 |
2010/01/10(日) 02:26:13
FortranをOpenMPで並列化したのですが、シリアルで実行した場合と結果が変わってしまって困っています。
たぶん共有変数の設定を間違って、書き込んではいけない変数に書き込みが発生してしまったのだと思うのですが、
どう直したらいいのかわかりません。
分かることがあれば教えて下さい。

[並列化したソースコード]http://gaatsu.ps.land.to/up/src/up_1444.png.html
[シリアルで実行した結果]http://gaatsu.ps.land.to/up/src/up_1445.png.html
[パラレルで実行した結果]http://gaatsu.ps.land.to/up/src/up_1446.png.html
z軸のプロットは、ソース中のloss_timeを描いています。
サブルーチンsubの中身は、関係する部分だけ書くと、以下のようになっています。
do i = 1, nend
  t=t+dt
  if (条件)
    loss_time = t
    return
  end if
end do
258デフォルトの名無しさん
垢版 |
2010/01/10(日) 02:29:09
すみません、最後の方で書いた内容、一部間違えました。

サブルーチンsubの中身は、関係する部分だけ書くと、以下のようになっています。
do i = 1, nend
  t=t+dt
  if (条件)
    loss_time = t
    return
  end if
loss_time = t
end do
2010/01/11(月) 10:56:24
多分原因はそこじゃないと思うけれど、共有変数の指定が間違っていると思うなら
privateもsharedも消してdefault(private)にしてみたらいいと思う。

あと基本的な質問だけど
「!$OMP parallel do」ではなくて
「!$OMP parallel」と「!$OMP do」
に分かれている必要性ってあるの?

parallelとdoを分ける文法を普段使わないから挙動が分からないんだけれど、
iのループが分担されずに-(maxGrid-1)から(maxGrid-1)のまま8つ生成されて、
jのループが分担されているのに1つのloss_timeを共有してそうな気がするんだけれど。
2010/01/12(火) 06:07:01
原因はそこじゃないな、おそらくアソコ。
261デフォルトの名無しさん
垢版 |
2010/01/14(木) 00:21:27
お返事ありがとうございます!

default(private)ではコンパイルは通っても、計算は動きませんでした。
(逐次領域→parallel領域で値が引き継がれないことが原因?)
なので、全ての変数をfirstprivateでやってみましたが、やはり間違った結果になりました。
!$OMP parallel doでiのループを並列化しても同じでした。


サブルーチンsubは、iやjによって計算時間が最大10000倍程度違うので、
iを分担すると負荷のバランスが偏るのでは?と思ったのでjを分担するようにしました。

>jのループが分担されているのに1つのloss_timeを共有してそうな
!$OMP parallel
の時点でメモリがスレッド数ぶん確保されるのではないんですか?
2010/01/14(木) 04:03:22
そういや、default(shared) をいったんprivateに変えてしまうと
同じ階層のメイン・副プログラム内でそれ以降全部のdefaultが変わるので面倒くさくなるんだよねぇ。
263259
垢版 |
2010/01/14(木) 10:33:17
>>261
> !$OMP parallel
> の時点でメモリがスレッド数ぶん確保されるのではないんですか?
そうだけど「!$OMP parallel」の時点で「do i」が「iの範囲が同じで」8つ生成される。まずこれが無駄でしょ?
次にloss_timeも8つ確保されているけれど、8つのスレッドでiが同じ動きをしているので「$OMP do」のjでの挙動がわかりにくい。

do jでloss_timeが共有されると言ったのは勘違いかもしれないが、よく分からないので時間があったら試してみる。

> !$OMP parallel doでiのループを並列化しても同じでした。
<中略>
> iを分担すると負荷のバランスが偏るのでは?と思ったのでjを分担するようにしました。
jを分担したいのだから、「!$OMP parallel do」を「do j」に設置する必要があると思うんだ。
2010/01/17(日) 10:42:45
OpenMP自身は共有メモリで使われる事を仮定してるから・・・
!$OMP parallel
にさしかかった時点ではメモリはいじらないとおもうよ。
全スレッドの同期確認作業(結構時間ペナルティがきつい)をするので
減らせるなら積極的に parallel 文を減らすようにするのがいい、と推奨されてるだけ。
265デフォルトの名無しさん
垢版 |
2010/01/22(金) 00:19:10
VisualStudio2008でなんだけど、
#pragma omp parallel for でfor文の中にbreakあるとダメだった気がしたんだけど、
WindowsSDK7.0入れてから久々に使ってみたらbreak入っててもコンパイルエラーにはならなかった。
もともと大丈夫だったっけ?
2010/01/28(木) 12:04:56
ダメとは聞かないけどな。intel の Fortran だと文句はいわれないと記憶。
でも、どのシステム&実装でも受け入れてもらえるように
break の条件を満たす場所を見つけたらそこでbreakするのではなく
フラグを立ててそのあとの for loop は制御の整数をインクリするだけで
担当の範囲は回すようにするといいのかも。

#pragma いろいろその0
for (i=0;i<imax;i++){
int ibreak=0;
if (ibreak == 0){
いろいろその1;
if (なんか条件) {ibreak = 1;}
いろいろその2;
} // end-if-ibreak
} // end-for-i

とか。
2010/01/28(木) 12:06:08
あ、これじゃダメだw
int ibreak=0;
は外にだしてね。
2010/02/11(木) 04:19:22
下記の様にOpenMPでタスク並列化を行う場合に、
スレッド数を動的に変化させたい場合はどのようにやるのでしょうか?

#include <omp.h>
int main(){
#pragma omp parallel sections
{
#pragma omp section
{
処理1
}
#pragma omp section
{
処理2
}
:
:
#pragma omp section
{
処理N
}
}
}
269デフォルトの名無しさん
垢版 |
2010/03/19(金) 17:06:32
CPUがHTかどうかによって並列数を変えたいのですが、物理的なコアの数を取得する方法はありませんか?
2010/03/19(金) 17:35:05
>>269
/proc/cpuinfo辺り見てなんとかならない?
2010/03/20(土) 05:26:30
Linuxなら
int cpu_num = sysconf(_SC_NPROCESSORS_CONF)
Windowsなら
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
で、sisinfoのdwNumberOfProcessorsメンバの中にはいっている。
ちなみにintな。
272デフォルトの名無しさん
垢版 |
2010/03/24(水) 08:25:08
Winだと NUM_OF_CPU みたいな環境変数があった気がするけどちがったかな?
2010/03/24(水) 23:12:52
NUMBER_OF_PROCESSORS
274272
垢版 |
2010/03/25(木) 03:13:10
それそれ、ありがと
275デフォルトの名無しさん
垢版 |
2010/03/30(火) 17:45:37
CPUのコア数以上にスレッドの数を増やすと急激にパフォーマンスが落ちるのだけどなぜなのでしょうか?
Phenom II X4ですが、5スレッドにしたとたん、全スレッドのパフォーマンスが半分以下(2倍以上時間がかかる)
ようになります。OSはubuntu9.04です。
2010/03/30(火) 18:43:55
スレッド数>コア数ってことはデスマーチ状態なので、
バタバタと戦友たちが倒れていってるんだろうな。
2010/03/30(火) 20:04:58
同時に二つのことをやるとき、一つのことだけをやるのと効率が変わらないとか、
どんな仕事でも 5 分割でパラレルになるように区分けできる
天才ってまれにいるけど、 >>275 はそういうタイプ。
278デフォルトの名無しさん
垢版 |
2010/03/30(火) 21:58:05
>>275
コンテキスト切り替え(スイッチ)
2010/03/31(水) 06:27:33
>>275
8スレッドにすると4のときと同じくらいの時間で終わる・・・かも。
2010/03/31(水) 07:36:37
>>275
当たり前の話だ。各スレッドがリソースを取り合っているんだよ。
物理コアが4つしかないのに、5スレッドが走っているわけだから、
物理コアたちが「俺が行くぞ」「ふざけんな俺が行くんだ!」とか「おまえ行けよ、いやおまえが行けよ」
ということをやっているわけだ。
本来ならセマフォで4スレッドに制限すればよいんだけど、OpenMPではどういう風にやるっけな?
まだ対応していないと思ったけどもしOpenMPでやるなら結構トリッキーな実装になりそうだな。
2010/03/31(水) 13:14:08
4プロセスのとき、4つのコアがそれぞれ100%がんばる
5プロのとき、1つのコアが2スレッド分を負担して100%がんばってるけど
ほかの3つが50%しかがんばれない。
がんばらない、じゃなくてがんばれない。同期取るからね。
>>279 のとおり8にすると4コアみんな100%の力を出せるようになる。
282デフォルトの名無しさん
垢版 |
2010/03/31(水) 13:54:11
>>279
>>281
8にしてみたけど、そんなことはなかった。
劇遅になった。
2010/03/31(水) 15:09:17
ちゃんとプロセスと計算コアを固定してる?
タダでさえ>>280 の理由で非効率な部分があるんだから・・
taskset dplace のどちらかだろう。なければこれに当たる奴みつけてね。
dplace 後者はSGIのだけの気がするけど自信はない。
2010/03/31(水) 15:10:32
プロセス、スレッド・・・OpenMPだとスレッドのほうがいいのかな?
あまり気にしてなかったので今気になった
2010/03/31(水) 16:47:05
スレッドの実行時間が短すぎるんじゃないか。
それでコンテキストスイッチの割合が大きくなりすぎているのでは。
286デフォルトの名無しさん
垢版 |
2010/03/31(水) 17:09:12
#pragma omp parallel for
for

凄い長い計算

でやって味噌。
2010/04/01(木) 03:41:12
ちゃんとprivateも設定しろな。
288デフォルトの名無しさん
垢版 |
2010/04/07(水) 17:43:00
Intel Cluster OpenMPのセットアップ方法ってどこにあるの?
とりあえずライセンスファイルのダウンロードして、それをインストールするところまではできたのだけど・・・
ネットワークとかホストとかはどこで設定するの?
289デフォルトの名無しさん
垢版 |
2010/05/12(水) 05:18:00
ubuntu 10.04にしたらRunning Processの数がOpenMP Threadの数+1になるのだけど、どうして?
うちだけ?9.04の時はこんなことはありませんでした。
2010/05/12(水) 06:30:33
全体を総括するあまり忙しくないプロセスがあるから一個多いのが正常。
2010/05/21(金) 11:41:54
>>289
topコマンドで調べてみれば?
Ubuntuだとbackend
Fedoraだとnautilus
がプロセス1個占有してるようだよ
2010/05/23(日) 21:53:46
Fortranで !$omp parallel do private(...)
のprivate変数が多いので文字数制限に引っかかって改行しないといけないのですが、
括弧中で改行すると & や!$omp& で繋げてもうまく動きません。
どうやったらいいんでしょうか。PGIコンパイラです。
2010/05/23(日) 22:44:30
PGIは知らないがIntelのは

!$omp parallel &
! & do

とかで出来た気がする。
2行目の行頭が!か!$か!$omp かは忘れた。
2010/05/31(月) 23:23:36
c++でOpenMPを使う時に

#pragma omp parallel for 文の後の
forループ内でnew演算子使っても計算は保障されるの?

保障されない場合は回避方法はあるの?
2010/06/01(火) 00:31:24
保障されなきゃ話にならんだろ
2010/06/01(火) 01:58:47
>>294
ちょっと計算っていうのがわかりにくいが、
要はnewで確保した領域で計算した結果が保証されるのか?
っていう意味なのかな?だとすればyesだろうけど、
atomicを考えるとめんどくさいような気がするなあ。
297294
垢版 |
2010/06/01(火) 22:42:21
回答どうも
コンパイルは通ったんだけど並列化されない
なぜ?

チェックし直して
うまく動いたら改めて書き込みします
2010/06/01(火) 23:35:00
コード晒さずに結果だけ書かれてもな
2010/06/01(火) 23:45:19
#pragma omp parallel for private(共用しない変数) num_threads(スレッド数)
2010/06/02(水) 00:00:30
まさかshare変数をnewしたの?
2010/07/15(木) 01:58:36
よってたかって new か・・・・恐いな。
というかどうなるんだろう?
302デフォルトの名無しさん
垢版 |
2010/09/12(日) 05:59:15
この板では意味ないだろうけど・・・無意味にあげておく
2011/01/04(火) 02:21:11
このスレ過疎り過ぎ
GCC4.5.0 (MinGW) だとforループ中でbreakが使えないんだけど、解決する定石とかある?
とりあえずフラグ立てて解決したんだけどなにかいい方法があれば教えてくれ

// サンプル:指定された"TARGET"が見つかるまでのループ数を表示するプログラム
#include <stdio.h>
#include <omp.h>
#define FIN 100
#define TARGET 70

int main(){
int i, flag=0, cnt=0;
#pragma omp parallel for reduction(+:cnt)
for(i = 0;i < FIN;i++){
printf("%d: %d\n", omp_get_thread_num(), i);
cnt++;

if(flag){
printf("%d: break\n", omp_get_thread_num());
i+=FIN;
}

if(i == TARGET){
printf("%d: found and break\n", omp_get_thread_num());
flag = 1;
#pragma omp flush(flag)
i+=FIN;
}
}
printf("total %d loops\n",cnt);
return 0;
}
2011/01/04(火) 09:57:50
単純なループの場合は parallel for に頼らず自前で各スレッドのループ範囲を決めれば break できる。
フラグを使うのはスレッド間の同期に必要なので、break できたとしても無くせないと思われ。

#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 = (is + n < FIN) ? is + n : FIN;
printf("%d: %d-%d\n", omp_get_thread_num(), is, ie);
for(i = is; !found && i < ie; i++){
printf("%d: %d\n", omp_get_thread_num(), i);
cnt++;
if (i == TARGET){
found = 1;
#pragma omp flush(found)
printf("%d: found\n", omp_get_thread_num());
}
}
printf("%d: %d loops\n", omp_get_thread_num(), cnt);
}
printf("total %d loops\n",cnt);
return 0;
}
2011/01/05(水) 00:43:11
>>304 早速のレスサンクス
そのやり方はスマートだしちゃんと規格に準拠してるね

正月最後の休みを使って公式にあるOpenMP Specifications v3.0を読んでみたんだけど
for指示文に関連付けられたforループは規格で(jp:p.44)
// for (init-expr; test-expr; incr-expr) structured-block
// structured block:C/C++では、先頭に入口が一つと末尾に出口が一つある実行文か複合文、あるいはOpenMP構文。
// 出口点は構造化ブロックからのの分岐であってはいけません。
となってるから元々breakは無理なんだな

さらにtest-exprは
// var relational-op b または b relational-op var
//var:符号付き、または符号なしの整数型の変数 or C++の場合、ランダムアクセスイテレータ型の変数 or Cの場合、ポインタ型の変数
//b:varの型と一致した型のループ不定式
となってるから
>>303の for(i = 0;i < FIN;i++){ を for(i = 0;!flag && i < FIN;i++){ にはできない
>>304ならparallelリージョンのなかのループだから&&が使えてスマートに書けるんだな

おかげさまで勉強になったよ

参考
[en]http://www.openmp.org/mp-documents/spec30.pdf
[jp]http://www.openmp.org/mp-documents/OpenMP30spec-ja.pdf
306デフォルトの名無しさん
垢版 |
2011/02/25(金) 21:14:37.06
内部関数を別の関数に渡すコード断片があると(Intel Fortranの拡張)、
例えそれが実行されなくとも、性能がガタ落ちになるようだ。理由は不明だが。
2011/04/06(水) 18:59:25.73
LinuxでもしCPUに空きがあるなら、並列数をあげるようにしたいのですが、どのようにすればいいのでしょうか?
2011/04/23(土) 16:01:03.61
linuxでノンブロッキングなconnectって
connectよんでからselectで待つのが定石だと思ってたけど
connectが成功を返すまでsleepはさんでコールし続けるってコードを見かけた
これってありなの?
2011/04/23(土) 19:20:41.40
>>308
無し
あり得ない
レスポンスが遅くなるだけ
というか誤爆?
2011/04/25(月) 18:50:56.39
>>309
すまぬ、誤爆したうえ放置してた
2011/05/19(木) 08:24:03.85
omp_set_num_threadsってOpenMPのスレッド内で呼んでも有効にならないの?
2011/05/23(月) 11:29:46.68
>>311
スレッドを幾つ起動するかを、起動してから指定するの?
2011/07/01(金) 06:24:21.77
VC++2010でシングルスレッドのループが並列化したループの有無によって
速度変わってしまうのですが、原因分かりませんか?

ttp://ideone.com/Yn67n
2011/07/01(金) 12:39:39.32
>>313
環境が判らんからなんとも言えんが、シングルスレッドのループの裏でOpenMPか何かの処理が動いているとか?
ループ前後にsleep入れて様子見てみたらどうだろう。
2011/07/01(金) 14:43:07.70
clock()はCPU時間を取得するもの
なので、裏で走るスレッドの実行時間も加算される
実時間で計測する関数を使うようにしてみればいい
316313
垢版 |
2011/07/01(金) 15:14:31.88
原因をやんわりとではありますが掴めた気がします。

ttp://ideone.com/6g1yy
上記のコードの様に、時間取得用変数にvolatileをつけると並列ループの有無に関わらず
シングルスレッドループの速度が一定となりました。

また、時間計測処理を省いて体感で測ってみましたが、
こちらでも速度が一定な感があります。
(体感の為誤差は確認出来てませんが)


この事から、時間取得とOpenMP有効時の最適化は相性が悪いのではないかと思います。
根本的な解決にはなってませんが、回避策は分かりました、有難うございました。
2011/07/01(金) 15:15:14.35
リロードしてませんでした・・・
>>315そうしてみます、有難うございます。
2011/07/17(日) 14:48:54.13
taskとsectionの使い分けって?
2011/08/11(木) 16:34:58.28
fortran90でプログラミングしてるのに、
「C/C++プログラマーのためのOpenMP並列プログラミング」を買ってしまったんだが、
大まかな部分ってCもfortranも同じなのかな?
2011/08/11(木) 19:04:57.30
その本を窓から投げ捨てて、「fortran90 OpenMP」でググって出たPDFを読んだ方が100倍マシだよ。
2011/08/11(木) 23:46:57.30
>>320
おっけ今から全力でぶん投げてくる
2011/08/22(月) 01:58:44.67
くれ。
いや、どうせなら
図書館にでも寄贈してやってくれ
2011/08/22(月) 20:50:41.53
OpenMPのスタティックなライブラリってないの?
VCだとMP使うと再頒布可能パッケージが必要だ。
2011/08/22(月) 23:49:50.97
ttp://codezine.jp/article/detail/4693

> 先ほど構成をReleaseに変えてビルドした理由は、Debugでビルドして実行するには特別なファイルが
>必要になるからです。OpenMPをデバッグ構成でビルドするには、
>「Microsoft.VC90.DebugOpenMP.manifest」ファイルと「vcomp90d.dll」ファイル(VC2008の場合)が必要になります。
>このファイルはVisual Studio 2008のStandardバージョン以上ならば
>「C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP」
>にありますので、実行ファイルと同じ場所にコピーして下さい。そうすれば、
>Debug構成でも正常に実行できるようになります。

OpenMP対応を謳ってるくせに、なんでこんな面倒なことしないといけないんだろう・・・
プロパティで「OpenMP使う」ってするだけでできるようにしたらいいと思うんだけど。
(配布時は別途対応するにしても)
2011/08/23(火) 01:32:00.61
俺はフリーだろうとシェアウェアだろうと、
余計なモノをインストールさせるアプリは使わない。
2011/08/23(火) 01:56:49.13
Visual Studioなんて眼中に無さそうだね
2011/08/24(水) 20:10:32.31
>>324
その記事の筆者名でググって見たほうがよい
328324
垢版 |
2011/08/24(水) 21:41:49.47
>>327
ググってみました。
色々言われているみたいですね(汗)
もしOpenMP環境構築についての言及が誤りなら、
もっと正攻的なやり方があるということですね。
もうちと調べてみます。
2011/11/01(火) 13:47:35.24
C+11のparallel_forだとキャプチャする変数を指定する文法があることから
外側の関数からラムダ関数に変数を渡すっていうオーバーヘッドが
ありそうだけど、#pragma omp parallel forだとそのへんどうなってるの?
2011/11/15(火) 14:04:00.87
C++やC99において、OpenMPループの中で、変数を宣言するのは安全なのでしょうか?
例えば、
int sum = 0;
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < 100; i++) {
int tmp = i;
tmp++;
sum += tmp;
}

この例では、OpenMP並列化されたループ内で変数iとtmpを宣言していますが、
試してみたところ問題はなさそうです。
iもtmpもスレッドプライベート変数になると思うのですが…。
何か問題があればご教示をお願いいたします。
2011/11/15(火) 16:07:23.72
問題ないよ!
Private 扱いの理解で無問題
2011/11/15(火) 17:00:59.88
>331
ありがとうございます。これで安心して宣言できます。
今まではわざわざループの外で宣言していたので…。
2011/11/24(木) 16:58:17.76
CreateThreadで作成したスレッド内でompを使うと
スレッドが終了してもゴミスレやメモリが残ってしまうようなのですが
これを解放する関数とかありませんか?
2011/11/25(金) 08:06:46.80
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1015017355
_beginthreadex
2011/11/25(金) 12:24:01.62
_beginthreadex に置き換えてみましたがだめでした。
ompはランタイム関数ではないらしい?
2012/01/14(土) 23:38:53.03
OpenMP3.2とか出てきているみたいだけど、
OpenMPのバリア同期は関数内部でも使えるようになったのかな?
2012/04/20(金) 21:15:47.38
Android の NDK で使える様にならんかなぁ。。
338デフォルトの名無しさん
垢版 |
2012/05/03(木) 21:12:37.13
揚げ
2012/05/07(月) 19:38:56.61
質問なんですが、

do a=1,10
do b=1,50
call test1(a,b)
call test2(a,b)
call test3(a,b)
enddo
enddo

こんなプログラムを動かしたいんですけど
これをa=1,b=1の時はCPU1がtest1,2,3を動かして、
a=1,b=2の時はCPU2がtest1,2,3を動かして(ry・・・って感じに
プログラムしたいのですが、これはdoループをparallel doで挟むだけじゃダメですか?
2012/05/07(月) 19:40:00.56
>>339ですが
言語はfortranです
2012/05/08(火) 09:21:00.56
例の前に条件を言えよ
2012/05/08(火) 11:41:50.17
>>339
まあ、ふつうに
do a=1,10
を並列化して様子を見てみればいいんじゃね?
あるいは、
do i=1,10*50
a=(i-1)/50+1
b=mod(i-1,10)
,.,,,,,,,
enddo
として並列すべきループを一つにまとめて
dynamic な並列で処理するとか。
手元に本が無いので dynamic にするやり方がパッと出てこないが
2012/05/08(火) 14:55:56.02
と思ったら、b についての並列部分は
a に依存する可能性があるのか。
その場合は、2つのdo の間に
ディレクティブを入れるしかないな。

というか、まずは質問できるまで
いろいろ遊んでみるべし
2012/05/14(月) 11:39:23.47
privateって同じ変数でスレッドごとに違う数字を使えるってことだと思ってるんだけど、
これって配列をprivateに指定することってできますか?
2012/05/14(月) 15:04:04.76
できるよ
2012/05/14(月) 15:07:09.10
あ、あまり大きなサイズの配列を
private にすると、なんとか領域が
デフォを超えてエラーになるので、
何かの環境変数の値を変えないと
いけなかったハズ。
なんだっけ・・・heap だか stack だかいうヤツ。
2012/05/14(月) 17:44:28.28
>>346
stacksizeですか?ググったらそんな感じの出てきました!
ありがとうございます!
2012/05/18(金) 08:23:15.58
>>347
配列をprivateなんかにすんなよ。
ヒープに確保しておけ。
他のスレッドに触らせたくなければomp_set_lockとomp_unset_lockでアトミックしとけ。
2012/05/18(金) 08:42:39.22
通りすがりだけど、
omp_set_lock と omp_unset_lock
これの使い方がいまいちよくわかんないんだよね。
2012/05/18(金) 08:55:39.47
じゃ、使わなければいいじゃん。
判らんものを無理に使うことはないよ。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況