質問編集履歴
2
補足の補足
test
CHANGED
File without changes
|
test
CHANGED
@@ -142,6 +142,48 @@
|
|
142
142
|
|
143
143
|
|
144
144
|
|
145
|
+
【補足に補足】
|
146
|
+
|
147
|
+
回答していただいた3人の方、ありがとうございます。
|
148
|
+
|
149
|
+
「C++はコンパイル時に最適化されるので、どんなふうに書いても、それは今回の質問内容に対する議論にはならない」と、あるのですが、まだちゃんと納得することができていません。
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
実際、段数が2回のときと4回のときの実行時間(10回行ったものの平均)は
|
154
|
+
|
155
|
+
2: 0.12299
|
156
|
+
|
157
|
+
4: 0.07963
|
158
|
+
|
159
|
+
となっており、この辺では大幅に効果が出ています。
|
160
|
+
|
161
|
+
どんなコードでも同じ挙動を示すものなら最適化され、最も良いもので実行されるのであれば、こんな風にはならない気がします。
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
また、僕は普段はC++を使っていないので、友だちに聞いた方法でコンパイルしたのですが、それは「windowsPCのコマンドプロンプトで<code>cl ファイル名.cpp</code>を実行」するものです。このコンパイルの方法が最適化されたものなのかどうかはわかっていません。
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
また[ソフトウェアパイプラインのwikiのページ](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3)では、こんな記述がありました。
|
170
|
+
|
171
|
+
> パイプライン化された(命令パイプラインの記事を参照)プロセッサの実行ユニットで効率良く実行できるように命令スケジューリングできるよう、プログラムを変形するという手法である。高度なコンパイラではコンパイラ最適化により行われることもあるが、一般にはしばしば、多数回繰り返されるが1回の処理内容がごくわずかなループ(画像処理や信号処理などには多い)について、手作業で、一種のアウト・オブ・オーダー実行のようなプログラムの書換え(ループの繰返しをまたいで、コードの順序を前後に入れ替えることが多い)を行う。
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
と、あります。以上の結果と、このページの説明を見ると、最適化されておらず、やはり変数の数を変えることで実行時間に影響があるのかなと感じます。
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
そして、その上で僕が知りたくて四苦八苦しているのは、以上のことが前提としてある上で、「なぜ64個の方が32個のものより時間がかかったのか」なのです。
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
長々と、そして何度も補足してすみません。
|
184
|
+
|
185
|
+
|
186
|
+
|
145
187
|
どなたかわかる方がいらっしゃれば教えて頂けるとうれしいです。
|
146
188
|
|
147
189
|
よろしくお願いします。
|
1
補足
test
CHANGED
File without changes
|
test
CHANGED
@@ -76,6 +76,72 @@
|
|
76
76
|
|
77
77
|
|
78
78
|
|
79
|
+
|
80
|
+
|
81
|
+
【補足】
|
82
|
+
|
83
|
+
少し補足します。
|
84
|
+
|
85
|
+
```C++
|
86
|
+
|
87
|
+
startTimer();
|
88
|
+
|
89
|
+
double d0, d1, d2, d3;
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
d0 = 0.0; d1 = 0.0; d2 = 0.0; d3 = 0.0;
|
94
|
+
|
95
|
+
for (int i = 0; i < N; i += 4) {
|
96
|
+
|
97
|
+
d0 += b[i + 0];
|
98
|
+
|
99
|
+
d1 += b[i + 1];
|
100
|
+
|
101
|
+
d2 += b[i + 2];
|
102
|
+
|
103
|
+
d3 += b[i + 3];
|
104
|
+
|
105
|
+
}
|
106
|
+
|
107
|
+
c = d0 + d1 + d2 + d3;
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
stopTimer();
|
112
|
+
|
113
|
+
```
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
以上のようなコード(これは4つバージョン)でかかる時間を計測し、2,4,8,16,32,64のバージョンもそれぞれ試して、その実行時間の差を比べます。
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
するとコード内の演算子(+,=,<)の数が異なるので、実行時間い差が生じます。
|
122
|
+
|
123
|
+
例えば変数が2個の場合は、
|
124
|
+
|
125
|
+
「=」が 3N/3 + 4回
|
126
|
+
|
127
|
+
「+」が 5N/2 + 1回
|
128
|
+
|
129
|
+
「<」が 1N/2 + 1回で
|
130
|
+
|
131
|
+
合計で,(9N/2 + 6)回演算が行われていることになります。
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
また、変数が4つの場合は、合計で(15N/4 + 10)回の演算が行われているので、この演算の回数に依存するので、変数が増えれば増えるほど実行時間が短くなるのかなと思っていました。
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
しかし、この変数を32個、64個と増やしていくと、32個のときよりも64個のときのほうが時間(+0.002秒ほど)がかかってしましました。
|
140
|
+
|
141
|
+
演算の回数自体は64個のもののほうが少ないので、直感的には64個のもののほうが32個のものよりも短くなると思うのですが、どうしてこんな結果が出るのでしょうか。
|
142
|
+
|
143
|
+
|
144
|
+
|
79
145
|
どなたかわかる方がいらっしゃれば教えて頂けるとうれしいです。
|
80
146
|
|
81
147
|
よろしくお願いします。
|