HOME»基本情報技術者試験掲示板»平成26年春期午後問3
投稿する
平成26年春期午後問3 [3779]
あさん(No.1)
https://www.fe-siken.com/kakomon/26_haru/pm03.html
設問2に関して質問させていただきたいです。
解説で、
b:「更新→参照」
c:「参照→更新」
とありますが、これらはどのように考えたらこの順序になるのでしょうか?
ご回答よろしくお願い致します。
設問2に関して質問させていただきたいです。
解説で、
b:「更新→参照」
c:「参照→更新」
とありますが、これらはどのように考えたらこの順序になるのでしょうか?
ご回答よろしくお願い致します。
2021.11.06 11:07
chihiroさん(No.2)
★FE プラチナマイスター
プログラムを分割して並列実行する場合、その処理の結果は分割せずに処理した場合の結果と一致していなければなりません。
そのためには問題文にも書かれているように、並列実行してもデータの更新と参照の順序が変わらないことが保証されている必要があります。
例えばプログラム1は、a[i]←a[i-1]+b[i]とあるように、一つ前のaの結果を参照して今回のaの結果を出し、更新するというアルゴリズムになっています。
前の結果を参照→更新して次に進む→前の結果を参照→…を繰り返しているのです。
つまり更新「後」の値を次の繰り返しで参照しています。(よってアが答え)
これを並列実行しようとした場合、解説にもあるように、スレッド1がa[3]の更新を行う前に、スレッド2がa[3]の参照を行ってしまう可能性があります。
本来であれば更新「後」の値を参照すべきところを更新「前」の値を参照してしまえば、データの更新と参照の順序が守られず、結果が一致しなくなってしまいます。
プログラム2についても同様です。
本来は更新「前」の次のaの値を参照して今のaの値を更新する処理を繰り返すのですが、並列実行した場合、参照する前の値を先に更新し、更新「後」の値を参照してしまう可能性が生じます。
更新→参照か、参照→更新かの順序を考えるよりは、更新「後」の値を参照するのか、更新「前」の値を参照するのかを考えた方が答えを出しやすいかもしれません。
ちなみに令和元年秋期 午後問2にも同じ題材の問題が出題されているので、まだ解かれていなければ一度解いてみることをおすすめします。(本問よりは易しいと思います)
そのためには問題文にも書かれているように、並列実行してもデータの更新と参照の順序が変わらないことが保証されている必要があります。
例えばプログラム1は、a[i]←a[i-1]+b[i]とあるように、一つ前のaの結果を参照して今回のaの結果を出し、更新するというアルゴリズムになっています。
前の結果を参照→更新して次に進む→前の結果を参照→…を繰り返しているのです。
つまり更新「後」の値を次の繰り返しで参照しています。(よってアが答え)
これを並列実行しようとした場合、解説にもあるように、スレッド1がa[3]の更新を行う前に、スレッド2がa[3]の参照を行ってしまう可能性があります。
本来であれば更新「後」の値を参照すべきところを更新「前」の値を参照してしまえば、データの更新と参照の順序が守られず、結果が一致しなくなってしまいます。
プログラム2についても同様です。
本来は更新「前」の次のaの値を参照して今のaの値を更新する処理を繰り返すのですが、並列実行した場合、参照する前の値を先に更新し、更新「後」の値を参照してしまう可能性が生じます。
更新→参照か、参照→更新かの順序を考えるよりは、更新「後」の値を参照するのか、更新「前」の値を参照するのかを考えた方が答えを出しやすいかもしれません。
ちなみに令和元年秋期 午後問2にも同じ題材の問題が出題されているので、まだ解かれていなければ一度解いてみることをおすすめします。(本問よりは易しいと思います)
2021.11.06 11:56
あさん(No.3)
とても詳しくご説明して下さりありがとうございます。
令和元年秋期 午後問2はまだ解いておりませんので解いてみます。
令和元年秋期 午後問2はまだ解いておりませんので解いてみます。
2021.11.06 14:14