- 2010-09-06 (Mon) 20:40
- プログラミング
d 次元ベクトル n 本の和を求めるプログラムを書け.つまり,s と x_i をベクトルとして s = \SUM_{i = 0}^{n-1} x_i を計算せよ.ただし,d ≪ n とする.なお,後で和を求める部分を並列化する予定なのでそれを考慮してね.
という注文に対して,次のプログラムが返ってきた.
for(int j = 0; j < d; j++) for(int i = 0; i < n; i++) s[j] += x[i * d + j];
何故こうなった?
元々の計算式を元にプログラムの構造を考えればループの順番が不自然だと思うのだけど… 何故にわざわざベクトルの次元のループを外側に持ってきだのだろうか? 構造的に不自然な上に配列 x の読み込みが連続でなくて時間的にも不利になると思うのだけど.そして二つのループのうち並列化すべきは i のループなわけで,それが内側にあると下手すりゃ同期が増えて無駄なのに.こんなのは非効率かつ非明確なプログラムであって百害あって一利なし.
なんていうことを考えずにプログラムを書くのが普通なのだろうか? よくわからん.とりあえずきれいなプログラムを書く事を最優先して欲しい.
閑話休題.
効率改善のためにとある仕組みを導入しようとしている場合,その仕組みが本当に効率を上げられるのかどうかを事前にちゃんと考えて欲しい.効率改悪の仕組みとか入れてもしょうがないし,効率改善が出来ず無駄にプログラムを汚くしてもしょうがないし.
どこかに泉はないのだろうか?
- Newer: AWK - はじめ