
ケース1)
int main() {
int i;
for(i=0; i<10; i++) {
...
}
for(i=0; i<10; i++) {
...
}
for(i=0; i<10; i++) {
...
}
...
return 0;
}
ケース2)
int main() {
for(int i=0; i<10; i++) {
...
}
for(int i=0; i<10; i++) {
...
}
for(int i=0; i<10; i++) {
...
}
...
return 0;
}
上記のケース2)の場合、変数iは各for文ごとに定義しているので、並列処理を行った場合でもコンパイラがそれぞれ別のアドレスを振ってくれると思うのですが、
ケース1)の場合、並列処理を行った場合でもコンパイラは、変数iに対して、別のアドレスを振ってくれることになるのでしょうか?(ケース1)は並列処理を行わない場合は、上から順番に実行していくだけなので問題はありません。)
No.3ベストアンサー
- 回答日時:
通常、並列処理(マルチプロセスやマルチスレッド)は、特殊な状態になるため、設計段階から、共有データ、排他制御、同期処理、などに注意しないと、思った通りの結果が得られなかったり、排他制御で、同時にイベント待ち状態になりデッドロックを起こしたりします
そのため、マルチスレッドプログラムや、別途プロセスを起動するようなプログラム、また、イベントのコールバックが非同期で呼び出される関数などを実装する場合には、非同期処理を意識してコードを書くべきですし、上記のようなコードを、コンパイルオプションなどによる設計者の指定なしに、コンパイラが勝手に並列処理を行うようなコードを吐くことはないと思ってます
もし、設計者の指定なしに、並列処理を行うコンパイラがあった場合には、その並列処理用のコンパイラの仕様に従って、記述すべきケースだと思いますし、その時の、変数 i はどのような扱いになるのかは、コンパイラ次第だと思いますし、その場合には、ケース1)のコードは並列処理は行われず、ケース2)の場合のみ並列処理になるような可能性もあります
使ったことはないですが、OpenMPの場合、スコープを指定して並列処理を行うようなので、質問者さんのコードで、for文のスコープを並列処理を行うように指定すると、変数 i は、反復変数なので、ケース1)、2)問わず、並列処理ごとで独立した変数として自動で扱われるようです
https://www.openmp.org/wp-content/uploads/openmp …
ただし、それがスタックエリア上の変数になるのか、または、CPUのレジスターを使用するコードを吐き出すのかまでは、分かりません
No.5
- 回答日時:
よく知りませんが、普通に考えれば、ですけど、ダーティなデータがあることを検出した時点で並列実行不可と判定すると思いますけどね。
ただ、ループ回数が10とかなら分岐ミスペナルティの割合が大きくなる可能性があるので、アンローリングして(つまりiはアドレス参照ではなく即値に変換)、ブロックごとに並列可として別個に処理させてしまうかもしれません。もちろん、「...」にデータの依存性がなければの話ですが。No.4
- 回答日時:
なんの保証もありません。
ケース2でも i が同じアドレスになる場合の方が多いでしょうね。
この辺はコンパイラの裁量次第です。
自動並列化するようにコンパイラなら必要に応じて別アドレスに
変数を割り当てるかもしれないけど・・・
No.2
- 回答日時:
普通にCプログラムを書けば、ロジックを解析して並列化してくれるようなCコンパイラの話でしょうか?
そういう機能はCの言語仕様の外の話なので、そのコンパイラがどういうコードを並列か可能と判断するかというのはそのコンパイラのドキュメントを見る必要があります。読むのが難しければ、コンパイルすると並列化したかどうかの情報を出力してくれるようなオプションがあれば、その結果を見ながらいろいろ修正して、どう書けば並列化してくれるか試してみるか。
直感的には、プログラムで変数の実体が1つだけと宣言されているのに、3つの実体を作り出してくれるかというと、無いかなという気がします。
あるいは、「絶対並列化できるものだけ並列化する」「バグるかも知れないけど積極的に並列化する」とかのオプションがあるかも。
同じように自動的に並列化してくれるFortranコンパイラの話を昔読んだことがありますが、「こう書くと並列化してくれず、こう書く必要がある」とかなりテクニックが必要だった気がします。
No.1
- 回答日時:
どうやって並列処理にするか、次第です。
ケース2でも、そのままでは並列処理にはなりません。
なんらかのライブラリ関数とかマクロとか命令とかを使って、並列処理用に書き換える必要があります。
その際に、変数が全スレッド共通なのか、各スレッド毎に独立なのか、設定できる場合があります。
例えば、OpenMPならprivateという設定があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- C言語・C++・C# プログラミングのペーパーテスト 実行結果の表示を答えてください #include <stdio.h> 2 2022/07/09 16:14
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
C言語のプログラムで...
-
main.c:7:43: warning: implici...
-
構造体の要素すべてに対する四...
-
enumについて
-
intとINTの違いは?
-
変数の型を定義しなかった場合...
-
コンパイルエラー
-
構造体のvectorを引数として関...
-
C言語の電卓におけるincludeに...
-
typedef enumの使い方を教えて...
-
【C++クラス設計】ある関数の引...
-
構造体を引数とする、クラス間...
-
void func( void )について
-
C++の規格
-
C++で構造体のコピーはできても...
-
C++でboolにintの値を代入する...
-
コンパイルすると error C1083 ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
main.c:7:43: warning: implici...
-
2重定義って??
-
変数の型を定義しなかった場合...
-
C++でboolにintの値を代入する...
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
ハンドルされていない例外が発...
-
void func( void )について
-
C言語のコンパイルエラー
-
enumについて
-
関数の実体定義にヘッダファイ...
-
C言語 宣言した変数になにも代...
-
C++ クラスをメンバにもつクラ...
-
プログラムの中で別のmainを呼...
-
sshdログの意味
おすすめ情報