アカウント名:
パスワード:
処理性能に関して記事にないってことはIntelが発表で触れていないってことか?Intelが性能を発表しないってことはお察しってことだな。
Galileoの記事ですが、
『Intel Galileoを試す - 超小型SoC「Quark X1000」搭載のArduino互換ボード』http://news.mynavi.jp/articles/2013/12/28/galileo/002.html [mynavi.jp]
#define REPEAT 90000void setup(){ pinMode(13, OUTPUT);}
void loop(){ unsigned long lpCnt1,lpCnt2,lpCnt3; unsigned long num;
delay(1000); digitalWrite(13, HIGH); for(lpCnt1=0; lpCnt1<500; lpCnt1++) { for(lpCnt2=0; lpCnt2<REPEAT; lpCnt2++) { for(lpCnt3=0; lpCnt3<REPEAT; lpCnt3++) { num+=lpCnt2+lpCnt3; } } } if(num) digitalWrite(13, LOW); else digitalWrite(13, LOW); while(1);}
「81億回の足し算を500回繰り返す」処理が「約1秒未満(一瞬)」で、「性能は猛烈に高い」だそうです(ってアホか)。
> 「81億回の足し算を500回繰り返す」処理が「約1秒未満(一瞬)」で、「性能は猛烈に高い」だそうです(ってアホか)。
400MHz で、81億×500回の加算を実行できるとすると、instruction per clockは、10125以上! べらぼうに速い!…てなわけがなくて、何か勘違いしてますね、これきっと。実際は、これより10進で4桁以上少ない演算しかしてないはず。プログラムの字面は確かに90000*90000*500回のループなので、コンパイラが最適化してループを定数計算に直しちゃってる?
> 最適化してループを定数計算に直しちゃってる?
多分そうですね例えば gcc-4.8 だと-O2 以上でループが定数計算になります.抜粋すると,こんな感じです
.globl loop .type loop, @functionloop:.LFB1: .cfi_startproc subl $28, %esp .cfi_def_cfa_offset 32 movl $1000, (%esp) call delay movl $2, 4(%esp) movl $13, (%esp) call digitalWrite movl $1, 4(%esp) movl $13, (%esp) call digitalWrite.L4: jmp .L4 .cfi_endproc
ですよねえ。えっこれ、コンパイラ最適化の効果を示すためのコード例ですよね。 って思った。
num+=lpCnt2+lpCnt3;
てかこれだけで加算二回してるしね、「81億回の足し算を500回繰り返す」→162億回の加算を500回、= 8.1兆回の加算ですか、コンパイラの最適化もなくそのままなら。
if(num) digitalWrite(13, LOW);
else digitalWrite(13, LOW);
numの値に関わらず処理が同じなら、numの値を算出するループ処理はバッサリ削除される可能性はフツーに考えられますね。
numの値を算出するループ処理
そもそもnumの初期化してないんで算出される値も不定では
Galileo の開発環境である Arduino IDE 1.5.3 で同スケッチをビルドした際に生成された .o を objdump -d したところ、loop() のコードは
Disassembly of section .text._Z4loopv:
00000000 <_Z4loopv>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 14 sub $0x14,%esp 6: 68 e8 03 00 00 push $0x3e8 b: e8 fc ff ff ff ca
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
普通のやつらの下を行け -- バッドノウハウ専門家
処理性能は…… (スコア:0)
処理性能に関して記事にないってことはIntelが発表で触れていないってことか?
Intelが性能を発表しないってことはお察しってことだな。
Re:処理性能は…… (スコア:1)
Galileoの記事ですが、
『Intel Galileoを試す - 超小型SoC「Quark X1000」搭載のArduino互換ボード』
http://news.mynavi.jp/articles/2013/12/28/galileo/002.html [mynavi.jp]
#define REPEAT 90000
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
unsigned long lpCnt1,lpCnt2,lpCnt3;
unsigned long num;
delay(1000);
digitalWrite(13, HIGH);
for(lpCnt1=0; lpCnt1<500; lpCnt1++)
{
for(lpCnt2=0; lpCnt2<REPEAT; lpCnt2++)
{
for(lpCnt3=0; lpCnt3<REPEAT; lpCnt3++)
{
num+=lpCnt2+lpCnt3;
}
}
}
if(num) digitalWrite(13, LOW);
else digitalWrite(13, LOW);
while(1);
}
「81億回の足し算を500回繰り返す」処理が「約1秒未満(一瞬)」で、「性能は猛烈に高い」だそうです(ってアホか)。
Re:処理性能は…… (スコア:2, 興味深い)
> 「81億回の足し算を500回繰り返す」処理が「約1秒未満(一瞬)」で、「性能は猛烈に高い」だそうです(ってアホか)。
400MHz で、81億×500回の加算を実行できるとすると、instruction per clock
は、10125以上! べらぼうに速い!…てなわけがなくて、何か勘違いしてますね、
これきっと。
実際は、これより10進で4桁以上少ない演算しかしてないはず。
プログラムの字面は確かに90000*90000*500回のループなので、コンパイラが
最適化してループを定数計算に直しちゃってる?
Re:処理性能は…… (スコア:3)
> 最適化してループを定数計算に直しちゃってる?
多分そうですね
例えば gcc-4.8 だと-O2 以上でループが定数計算になります.抜粋すると,こんな感じです
.globl loop
.type loop, @function
loop:
.LFB1:
.cfi_startproc
subl $28, %esp
.cfi_def_cfa_offset 32
movl $1000, (%esp)
call delay
movl $2, 4(%esp)
movl $13, (%esp)
call digitalWrite
movl $1, 4(%esp)
movl $13, (%esp)
call digitalWrite
.L4:
jmp .L4
.cfi_endproc
Re:処理性能は…… (スコア:1)
ですよねえ。
えっこれ、コンパイラ最適化の効果を示すためのコード例ですよね。 って思った。
Re: (スコア:0)
num+=lpCnt2+lpCnt3;
てかこれだけで加算二回してるしね、
「81億回の足し算を500回繰り返す」
→162億回の加算を500回、= 8.1兆回の加算ですか、コンパイラの最適化もなくそのままなら。
Re: (スコア:0)
if(num) digitalWrite(13, LOW);
else digitalWrite(13, LOW);
numの値に関わらず処理が同じなら、numの値を算出するループ処理はバッサリ削除される可能性はフツーに考えられますね。
Re: (スコア:0)
numの値を算出するループ処理
そもそもnumの初期化してないんで算出される値も不定では
Re: (スコア:0)
Galileo の開発環境である Arduino IDE 1.5.3 で同スケッチをビルドした際に生成された .o を objdump -d したところ、loop() のコードは
Disassembly of section .text._Z4loopv:
00000000 <_Z4loopv>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 14 sub $0x14,%esp
6: 68 e8 03 00 00 push $0x3e8
b: e8 fc ff ff ff ca