C/JAVA: 2007年12月アーカイブ
配列の二乗和を計算する関数のサイクルカウントとCPE値を測定する課題が出た。
- sum = a[0]2 + a[1]2 + … + a[N-1]2
配列の長さを変化させ、所要時間(サイクルカウント)と要素数(N)で割ったCPE値の測定をした。
あまり気合入れてないのに、すばらしく時間がかかってしまった…w
測定した配列の要素数はN = 100, 500, 1000, 5000, 10000, 50000,100000,500000であり、
初回実行の結果を除く、10回の平均値(もしくは最小値)を使用した。
時間測定にはstart_counter()及びget_counter()を用い、
volatile double型とvolatile int型への代入も考慮した。
パラレルでの分割数が異なる4つの二乗和の関数を準備し、比較を行った。
分割:1, 2, 4, 8
- sum += a[i]*a[i]
- sum += a[i]*a[i] + a[i+1]*a[i+1]
- sum += a[i]*a[i] + a[i+1]*a[i+1] + a[i+2]*a[i+2] + a[i+3]*a[i+3]
- sum += a[i]*a[i] + a[i+1]*a[i+1] + a[i+2]*a[i+2] + a[i+3]*a[i+3] + a[i+4]*a[i+4] + a[i+5]*a[i+5] + a[i+6]*a[i+6] + a[i+7]*a[i+7]
要素数におけるサイクルカウントを両対数グラフにすると以下のようになる。
余談ながら、エクセルの対数グラフって散布図のときしかできないんだね、やられた><;
だから忘れぬようにメモしておく、、、
補数表現による負数は減算への利用でよくシスアドとかに出てくるよね。
ビット反転させて、(1)2を足すだけ。8bitの整数表現で-102を表現したければ、
(102)10⇒(66)16⇒(01100110)2
(-102)10⇒(10011010)2となる
IEEE754として標準化されているの浮動小数点数演算について、
単精度浮動小数点数は 符号1bit 指数部8bit 仮数部23bit の計32bit
符号をhidden bitとすれば…
-3.5=-(11.1)2=-(1.11×21)2
⇒ "1 | 1000 0000 | 1100 0000 0000 0000 0000 0000"
15.75=-(1111.11)2=-(1.11111×23)2
⇒ "0 | 1000 0010 | 1111 1000 0000 0000 0000 0000"
指数部の例:
1000 0010 23 0111 1111 20
1000 0001 22 0111 1110 2-1
1000 0000 21 0111 1101 2-2
10進数への換算は逆の考え
例:”1 | 1000 0100 | 1101 0000 0000 0000 0000”
- | 25 | 1.1101 ⇒ -(111010) ⇒ - (32+16+8+2) ⇒-58
ソースの表示用JavaScriptの"dp.SyntaxHighlighter"を導入したので試して見る。
>java FloatingPoint -3.5
-3.5 = 11000000011000000000000000000000
>java FloatingPoint 15.75
15.75 = 1000001011111000000000000000000
>java FloatingPoint -58
-58 = 11000010011010000000000000000000