【コラム】

セカンド・オピニオン

186 Core MicroArchitectureをもうすこし(10)

 

186/421

先週はちょっと私用、というかスケジュールが立て込んでいてお休みさせていただきました。申し訳ありません。

Intelが考えるSustained Performance(続き)

SandraのDhrystoneのスコアだと何故まずいかという話は2つあって、

  • オリジナルのDhrystoneは、内部で関数callを煩雑に行っている。このため、普通にコンパイルするとPush/Popが猛烈に発生する関係で、Dedicated Stack Managerを持っているCore2のスコアが当然良い。
  • SandraのDhrystoneは、オリジナルを元に猛烈に手が入ったもので、もはや原形を留めていないので、Push/Popが今も行われているかどうかすらよく判らない。

というあたりだ。まず2つ目の話からすると、Dhrystoneのオリジナルは今もソースが入手できるが(以前使った時は、こちらから入手したが、今は何故かアクセス不能である。いまだとこちらから入手できるが、ソースに直すにはsedが必要になるので注意)、見ていただくと判るとおりこれはシングルスレッドのプログラムであり、一方Sandraのそれはマルチスレッドにフル対応したものになる。Dhrystone自体、最適化すると何も残らなくなりかねないほどにコード的には無意味なもので(例えばインライン展開を掛けると、コンパイラによっては猛烈なまでに処理が減る)、なのでSandraも恐らくコア部分は手をつけずに、単にCPUの数だけスレッドを立ち上げ、各々が独立にDhrystoneを一定時間実行し、最後に全体の合計スコアを算出するといった処理になっていると思うが(ドキュメントの記述もこんな感じである)、変更後のソースが未公開なので確証はない。

前者はもうちょっと込み入った話になる。Dhrystoneは内部で非常に煩雑に関数呼び出しを行う。関数呼び出し=PUSH/POPの多用、という構図はx86では避けられない話で、実際引数を積んだり、必要なレジスタを退避するのに、かなり煩雑にPUSH/POPが利用されている。もっとも、これはOptimizeの程度にも関係する。たとえばFunc_2()という関数の場合、List1の様なソースコードになっている。これをVisual C++ 6.0でDebug BuildにするとList2の、Release BuildにするとList3のようなアセンブラソースが出てくる。比較していただくと判るとおり、PUSH/POPの数が大幅に変わってくるのが判るはずだ。もっと極端なのは64bit環境の場合。以前こちらで示した通り、x64環境で真っ当なコンパイラを使うと、R8~R15という新規に増えた汎用レジスタを使い、PUSH/POPが大幅に減り、性能は下手をすると2倍以上伸びたりする(こちらのグラフ11、12参照)場合すらある。つまり、PUSH/POPは明らかに性能に多大な影響を与える可能性がある(*1)といえる。

で、何でこんなことを延々と話をしたかというと、Pentium MとPrescott以降のPentium 4やその後継製品、当然Core 2にも、Dedicated Stack Managerが搭載されており、スタック操作はALUを使わないからだ。Dedicated Stack Managerの威力は、ちょっと古いデータはこちら、もう少し新しいデータはこちらで示しているが、かなり大きい事が見て取れる。言うまでもなく現在のK8にはこれに相当する機能はない。AMDも勿論このデメリットは理解しており、次世代のBarcelonaコアではSideband Stack Optimizerと呼ばれるメカニズムを追加してこれに対応する予定だ(Photo01)。ただ逆に言えば、x86でDhrystoneでALUの性能比較をするつもりであれば、このDedicated Stack Managerの分を割り引いて考えないといけない事になる。試しに自分でBuildしたDhrystoneの数値を比較してみると

CPU Debug Build(MIPS) Release Build(MIPS)
Core 2 Extreme X6800(2.93GHz) 2017674.8 10882577.0
Athlon 64 X2 3800+(2GHz) 1582604.0 6386919.6

といった結果になる。これを1GHzあたりの性能で正規化してみると

CPU Debug(MIPS/GHz) Release(MIPS/GHz)
Core 2 Extreme X6800 688626.2 3714190.1
Athlon 64 X2 3800+ 791302.0 3193459.8

といった結果になる。(テストに使ったプログラムは添付したので、ご自分の環境でも試して欲しい)何でか、むしろDebug Buildの方が相対的にAthlon X2が高速だったりするのだが、それはともかくRelease Buildで比べると余り差が無いことが判る。そもそも数字自体が前回の数字と大幅に違うところを見ると、Sandraのスコアは純粋なMIPS値ではなくVAPS(VAX MIPS:VAX-11 780換算の性能。1 VAPS=1757.0MIPSという事でDhrystoneのソースの中では換算されている)比較なのかもしれないが、それにしても傾向がえらく違うことがわかる(もうちょい続く)

(*1)十分に最適化したプログラムはPUSH/POPが最小限に抑えられるので、PUSH/POPがレジスタ操作に変わっても、あまり影響が大きくない。このグラフで、Release_icc(Intel C++でRelease Build)にするとあまり性能が伸びないことからもこれは判る。従って、影響がどの程度あるかは、もとのプログラムの最適化次第ということになるので、「可能性がある」という持って廻った言い回しになっている。

Photo01:MicroProcessor Forum 2006 FallにおけるAMDのBen Sander氏(Principal Member of Technical Staff)の講演のプレゼンテーションより抜粋

List1:

Boolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref)
/*************************************************/
    /* executed once */
    /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */
    /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */

Str_30 Str_1_Par_Ref;
Str_30 Str_2_Par_Ref;
{
  REG One_Thirty Int_Loc;
      Capital_Letter Ch_Loc;

  Int_Loc = 2;
  while (Int_Loc <= 2) /* loop body executed once */
    if (Func_1 (Str_1_Par_Ref[Int_Loc],
                Str_2_Par_Ref[Int_Loc+1]) == Ident_1)
      /* then, executed */
    {
      Ch_Loc = 'A';
      Int_Loc += 1;
    } /* if, while */
  if (Ch_Loc >= 'W' && Ch_Loc < 'Z')
    /* then, not executed */
    Int_Loc = 7;
  if (Ch_Loc == 'R')
    /* then, not executed */
    return (true);
  else /* executed */
  {
    if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0)
      /* then, not executed */
    {
      Int_Loc += 7;
      Int_Glob = Int_Loc;
      return (true);
    }
    else /* executed */
      return (false);
  } /* if Ch_Loc */
} /* Func_2 */

List2:

PUBLIC _Func_2
EXTRN __RTC_UninitUse:NEAR
EXTRN _strcmp:NEAR
; Function compile flags: /Odt /RTCsu /ZI
; COMDAT _Func_2
_TEXT SEGMENT
$T1194 = -221 ; size = 1
_Ch_Loc$ = -17 ; size = 1
_Int_Loc$ = -8 ; size = 4
_Str_1_Par_Ref$ = 8 ; size = 4
_Str_2_Par_Ref$ = 12 ; size = 4
_Func_2 PROC NEAR ; COMDAT

; 148 : {

 push ebp
 mov ebp, esp
 sub esp, 228 ; 000000e4H
 push ebx
 push esi
 push edi
 lea edi, DWORD PTR [ebp-228]
 mov ecx, 57 ; 00000039H
 mov eax, -858993460 ; ccccccccH
 rep stosd
 mov BYTE PTR $T1194[ebp], 0

; 149 : REG One_Thirty Int_Loc;
; 150 : Capital_Letter Ch_Loc;
; 151 :
; 152 : Int_Loc = 2;

 mov DWORD PTR _Int_Loc$[ebp], 2
$L1150:

; 153 : while (Int_Loc <= 2) /* loop body executed once */

 cmp DWORD PTR _Int_Loc$[ebp], 2
 jg SHORT $L1151

; 154 : if (Func_1 (Str_1_Par_Ref[Int_Loc],
; 155 : Str_2_Par_Ref[Int_Loc+1]) == Ident_1)

 mov eax, DWORD PTR _Str_2_Par_Ref$[ebp]
 add eax, DWORD PTR _Int_Loc$[ebp]
 movsx ecx, BYTE PTR [eax+1]
 push ecx
 mov edx, DWORD PTR _Str_1_Par_Ref$[ebp]
 add edx, DWORD PTR _Int_Loc$[ebp]
 movsx eax, BYTE PTR [edx]
 push eax
 call _Func_1
 add esp, 8
 test eax, eax
 jne SHORT $L1152

; 156 : /* then, executed */
; 157 : {
; 158 : Ch_Loc = 'A';

 mov BYTE PTR $T1194[ebp], 1
 mov BYTE PTR _Ch_Loc$[ebp], 65 ; 00000041H

; 159 : Int_Loc += 1;

 mov eax, DWORD PTR _Int_Loc$[ebp]
 add eax, 1
 mov DWORD PTR _Int_Loc$[ebp], eax
$L1152:

; 160 : } /* if, while */
; 161 : if (Ch_Loc >= 'W' && Ch_Loc < 'Z')

 jmp SHORT $L1150
$L1151:
 cmp BYTE PTR $T1194[ebp], 0
 jne SHORT $L1195
 push OFFSET FLAT:$L1196
 call __RTC_UninitUse
 add esp, 4
$L1195:
 movsx eax, BYTE PTR _Ch_Loc$[ebp]
 cmp eax, 87 ; 00000057H
 jl SHORT $L1153
 cmp BYTE PTR $T1194[ebp], 0
 jne SHORT $L1198
 push OFFSET FLAT:$L1196
 call __RTC_UninitUse
 add esp, 4
$L1198:
 movsx eax, BYTE PTR _Ch_Loc$[ebp]
 cmp eax, 90 ; 0000005aH
 jge SHORT $L1153

; 162 : /* then, not executed */
; 163 : Int_Loc = 7;

 mov DWORD PTR _Int_Loc$[ebp], 7
$L1153:

; 164 : if (Ch_Loc == 'R')

 cmp BYTE PTR $T1194[ebp], 0
 jne SHORT $L1199
 push OFFSET FLAT:$L1196
 call __RTC_UninitUse
 add esp, 4
$L1199:
 movsx eax, BYTE PTR _Ch_Loc$[ebp]
 cmp eax, 82 ; 00000052H
 jne SHORT $L1154

; 165 : /* then, not executed */
; 166 : return (true);

 mov eax, 1
 jmp SHORT $L1146
$L1154:

; 167 : else /* executed */
; 168 : {
; 169 : if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0)

 mov eax, DWORD PTR _Str_2_Par_Ref$[ebp]
 push eax
 mov ecx, DWORD PTR _Str_1_Par_Ref$[ebp]
 push ecx
 call _strcmp
 add esp, 8
 test eax, eax
 jle SHORT $L1156

; 170 : /* then, not executed */
; 171 : {
; 172 : Int_Loc += 7;

 mov eax, DWORD PTR _Int_Loc$[ebp]
 add eax, 7
 mov DWORD PTR _Int_Loc$[ebp], eax

; 173 : Int_Glob = Int_Loc;

 mov eax, DWORD PTR _Int_Loc$[ebp]
 mov DWORD PTR _Int_Glob, eax

; 174 : return (true);

 mov eax, 1
 jmp SHORT $L1146
$L1156:

; 175 : }
; 176 : else /* executed */
; 177 : return (false);

 xor eax, eax
$L1146:

; 178 : } /* if Ch_Loc */
; 179 : } /* Func_2 */

 pop edi
 pop esi
 pop ebx
 add esp, 228 ; 000000e4H
 cmp ebp, esp
 call __RTC_CheckEsp
 mov esp, ebp
 pop ebp
 ret 0
$L1200:
$L1196:
 DB 67 ; 00000043H
 DB 104 ; 00000068H
 DB 95 ; 0000005fH
 DB 76 ; 0000004cH
 DB 111 ; 0000006fH
 DB 99 ; 00000063H
 DB 0
_Func_2 ENDP
; Function compile flags: /Odt /RTCsu /ZI
_TEXT ENDS

List3:

PUBLIC _Func_2
; Function compile flags: /Ogty
; COMDAT _Func_2
_TEXT SEGMENT
_Ch_Loc$ = -1 ; size = 1
_Str_1_Par_Ref$ = 8 ; size = 4
_Str_2_Par_Ref$ = 12 ; size = 4
_Func_2 PROC NEAR ; COMDAT

; 148 : {

 push ecx

; 149 : REG One_Thirty Int_Loc;
; 150 : Capital_Letter Ch_Loc;
; 151 :
; 152 : Int_Loc = 2;
; 153 : while (Int_Loc <= 2) /* loop body executed once */

 mov eax, DWORD PTR _Str_1_Par_Ref$[esp]
 mov dl, BYTE PTR _Ch_Loc$[esp+4]
 push ebx
 push esi
 mov esi, DWORD PTR _Str_2_Par_Ref$[esp+8]
 push edi
 mov edi, 2
$L1211:

; 154 : if (Func_1 (Str_1_Par_Ref[Int_Loc],
; 155 : Str_2_Par_Ref[Int_Loc+1]) == Ident_1)

 mov cl, BYTE PTR [edi+eax]
 cmp cl, BYTE PTR [esi+edi+1]
 jne SHORT $L1262
 mov BYTE PTR _Ch_1_Glob, cl
 jmp SHORT $L1213
$L1262:

; 156 : /* then, executed */
; 157 : {
; 158 : Ch_Loc = 'A';

 mov dl, 65 ; 00000041H

; 159 : Int_Loc += 1;

 inc edi
$L1213:

; 149 : REG One_Thirty Int_Loc;
; 150 : Capital_Letter Ch_Loc;
; 151 :
; 152 : Int_Loc = 2;
; 153 : while (Int_Loc <= 2) /* loop body executed once */

 cmp edi, 2
 jle SHORT $L1211

; 160 : } /* if, while */
; 161 :if (Ch_Loc >= 'W' && Ch_Loc < 'Z')

 cmp dl, 87 ; 00000057H
 jl SHORT $L1214
 cmp dl, 90 ; 0000005aH
 jge SHORT $L1214

; 162 : /* then, not executed */
; 163 : Int_Loc = 7;

 mov edi, 7
$L1214:

; 164 : if (Ch_Loc == 'R')

 cmp dl, 82 ; 00000052H

; 165 : /* then, not executed */
; 166 : return (true);

 je SHORT $L1267
$L1263:

; 167 : else /* executed */
; 168 : {
; 169 : if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0)

 mov dl, BYTE PTR [eax]
 mov bl, BYTE PTR [esi]
 mov cl, dl
 cmp dl, bl
 jne SHORT $L1264
 test cl, cl
 je SHORT $L1265
 mov dl, BYTE PTR [eax+1]
 mov bl, BYTE PTR [esi+1]
 mov cl, dl
 cmp dl, bl
 jne SHORT $L1264
 add eax, 2
 add esi, 2
 test cl, cl
 jne SHORT $L1263
$L1265:
 xor eax, eax
 jmp SHORT $L1266
$L1264:
 sbb eax, eax
 sbb eax, -1
$L1266:
 test eax, eax
 jle SHORT $L1217

; 170 : /* then, not executed */
; 171 : {
; 172 : Int_Loc += 7;

 add edi, 7

; 173 : Int_Glob = Int_Loc;

 mov DWORD PTR _Int_Glob, edi
$L1267:
 pop edi
 pop esi

; 174 : return (true);

 mov eax, 1
 pop ebx

; 178 : } /* if Ch_Loc */
; 179 : } /* Func_2 */

 pop ecx
 ret 0
$L1217:
 pop edi
 pop esi

; 175 : }
; 176 : else /* executed */
; 177 : return (false);

 xor eax, eax
 pop ebx

; 178 : } /* if Ch_Loc */
; 179 : } /* Func_2 */

 pop ecx
 ret 0
_Func_2 ENDP
_TEXT ENDS

186/421

インデックス

連載目次
第421回 MCUで遊ぼう Part2 (12)
第420回 MCUで遊ぼう Part2 (11)
第419回 MCUで遊ぼう Part2 (10)
第418回 MCUで遊ぼう Part2 (9)
第417回 MCUで遊ぼう Part2 (8)
第416回 MCUで遊ぼう Part2 (7)
第415回 MCUで遊ぼう Part2 (6)
第414回 MCUで遊ぼう Part2 (5)
第413回 MCUで遊ぼう Part2 (4)
第412回 MCUで遊ぼう Part2 (3)
第411回 MCUで遊ぼう Part2 (2)
第410回 MCUで遊ぼう Part2 (1)
第409回 MCUで遊ぼう(57)
第408回 MCUで遊ぼう(56)
第407回 MCUで遊ぼう(55)
第406回 MCUで遊ぼう(54)
第405回 MCUで遊ぼう(53)
第404回 MCUで遊ぼう(52)
第403回 MCUで遊ぼう(51)
第402回 MCUで遊ぼう(50)
第401回 MCUで遊ぼう(49)
第400回 MCUで遊ぼう(48)
第399回 MCUで遊ぼう(47)
第398回 MCUで遊ぼう(46)
第397回 MCUで遊ぼう(45)
第396回 MCUで遊ぼう(44)
第395回 MCUで遊ぼう(43)
第394回 MCUで遊ぼう(42)
第393回 MCUで遊ぼう(41)
第392回 MCUで遊ぼう(40)
第391回 MCUで遊ぼう(39)
第390回 MCUで遊ぼう(38)
第389回 MCUで遊ぼう(37)
第388回 MCUで遊ぼう(36)
第387回 MCUで遊ぼう(35)
第386回 MCUで遊ぼう(34)
第385回 MCUで遊ぼう(33)
第384回 MCUで遊ぼう(32)
第383回 MCUで遊ぼう(31)
第382回 MCUで遊ぼう(30)
第381回 MCUで遊ぼう(29)
第380回 MCUで遊ぼう(28)
第379回 MCUで遊ぼう(27)
第378回 MCUで遊ぼう(26)
第377回 MCUで遊ぼう(25)
第376回 MCUで遊ぼう(24)
第375回 MCUで遊ぼう(23)
第374回 MCUで遊ぼう(22)
第373回 MCUで遊ぼう(21)
第372回 MCUで遊ぼう(20)
第371回 MCUで遊ぼう(19)
第370回 MCUで遊ぼう(18)
第369回 MCUで遊ぼう(17)
第368回 MCUで遊ぼう(16)
第367回 MCUで遊ぼう(15)
第366回 MCUで遊ぼう(14)
第365回 MCUで遊ぼう(13)
第364回 MCUで遊ぼう(12)
第363回 MCUで遊ぼう(11)
第362回 MCUで遊ぼう(10)
第361回 MCUで遊ぼう(9)
第360回 MCUで遊ぼう(8)
第359回 MCUで遊ぼう(7)
第358回 MCUで遊ぼう(6)
第357回 MCUで遊ぼう(5)
第356回 MCUで遊ぼう(4)
第355回 MCUで遊ぼう(3)
第354回 MCUで遊ぼう(2)
第353回 MCUで遊ぼう(1)
第352回 MCUで遊ぼう(0)
第351回 USB 3.0の研究(78)
第350回 USB 3.0の研究(77)
第349回 USB 3.0の研究(76)
第348回 USB 3.0の研究(75)
第347回 USB 3.0の研究(74)
第346回 USB 3.0の研究(73)
第345回 USB 3.0の研究(72)
第344回 USB 3.0の研究(71)
第343回 USB 3.0の研究(70)
第342回 USB 3.0の研究(69)
第341回 USB 3.0の研究(68)
第340回 USB 3.0の研究(67)
第339回 USB 3.0の研究(66)
第338回 USB 3.0の研究(65)
第337回 USB 3.0の研究(64)
第336回 USB 3.0の研究(63)
第335回 USB 3.0の研究(62)
第334回 USB 3.0の研究(61)
第333回 USB 3.0の研究(60)
第332回 USB 3.0の研究(59)
第331回 USB 3.0の研究(58)
第330回 USB 3.0の研究(57)
第329回 USB 3.0の研究(56)
第328回 USB 3.0の研究(55)
第327回 USB 3.0の研究(54)
第326回 USB 3.0の研究(53)
第325回 USB 3.0の研究(52)
第324回 USB 3.0の研究(51)
第323回 USB 3.0の研究(50)
第322回 USB 3.0の研究(49)
第321回 USB 3.0の研究(48)
第320回 USB 3.0の研究(47)
第319回 USB 3.0の研究(46)
第318回 USB 3.0の研究(45)
第317回 USB 3.0の研究(44)
第316回 USB 3.0の研究(43)
第315回 USB 3.0の研究(42)
第314回 USB 3.0の研究(41)
第313回 USB 3.0の研究(40)
第312回 USB 3.0の研究(39)
第311回 USB 3.0の研究(38)
第310回 USB 3.0の研究(37)
第309回 USB 3.0の研究(36)
第308回 USB 3.0の研究(35)
第307回 USB 3.0の研究(34)
第306回 USB 3.0の研究(33)
第305回 USB 3.0の研究(32)
第304回 USB 3.0の研究(31)
第303回 USB 3.0の研究(30)
第302回 USB 3.0の研究(29)
第301回 USB 3.0の研究(28)
第300回 USB 3.0の研究(27)
第299回 USB 3.0の研究(26)
第298回 USB 3.0の研究(25)
第297回 USB 3.0の研究(24)
第296回 USB 3.0の研究(23)
第295回 USB 3.0の研究(22)
第294回 USB 3.0の研究(21)
第293回 USB 3.0の研究(20)
第292回 USB 3.0の研究(19)
第291回 USB 3.0の研究(18)
第290回 USB 3.0の研究(17)
第289回 USB 3.0の研究(16)
第288回 USB 3.0の研究(15)
第287回 USB 3.0の研究(14)
第286回 USB 3.0の研究(13)
第285回 USB 3.0の研究(12)
第284回 USB 3.0の研究(11)
第283回 USB 3.0の研究(10)
第282回 USB 3.0の研究(9)
第281回 USB 3.0の研究(8)
第280回 USB 3.0の研究(7)
第279回 USB 3.0の研究(6)
第278回 USB 3.0の研究(5)
第277回 USB 3.0の研究(4)
第276回 USB 3.0の研究(3)
第275回 USB 3.0の研究(2)
第274回 USB 3.0の研究(1)
第273回 Xilinx Japan, Sam Rogan氏インタビュー(14)
第272回 Xilinx Japan, Sam Rogan氏インタビュー(13)
第271回 Xilinx Japan, Sam Rogan氏インタビュー(12)
第270回 Xilinx Japan, Sam Rogan氏インタビュー(11)
第269回 Xilinx Japan, Sam Rogan氏インタビュー(10)
第268回 Xilinx Japan, Sam Rogan氏インタビュー(9)
第267回 Xilinx Japan, Sam Rogan氏インタビュー(8)
第266回 Xilinx Japan, Sam Rogan氏インタビュー(7)
第265回 Xilinx Japan, Sam Rogan氏インタビュー(6)
第264回 Xilinx Japan, Sam Rogan氏インタビュー(5)
第263回 Xilinx Japan, Sam Rogan氏インタビュー(4)
第262回 Xilinx Japan, Sam Rogan氏インタビュー(3)
第261回 Xilinx Japan, Sam Rogan氏インタビュー(2)
第260回 Xilinx Japan, Sam Rogan氏インタビュー(1)
第259回 Reconfigurable Processorを開発するIPFlex(13)
第258回 Reconfigurable Processorを開発するIPFlex(12)
第257回 Reconfigurable Processorを開発するIPFlex(11)
第256回 Reconfigurable Processorを開発するIPFlex(10)
第255回 Reconfigurable Processorを開発するIPFlex(9)
第254回 Reconfigurable Processorを開発するIPFlex(8)
第253回 Reconfigurable Processorを開発するIPFlex(7)
第252回 Reconfigurable Processorを開発するIPFlex(6)
第251回 Reconfigurable Processorを開発するIPFlex(5)
第250回 Reconfigurable Processorを開発するIPFlex(4)
第249回 Reconfigurable Processorを開発するIPFlex(3)
第248回 Reconfigurable Processorを開発するIPFlex(2)
第247回 Reconfigurable Processorを開発するIPFlex(1)
第246回 RAMBUSのTBI(7)
第245回 RAMBUSのTBI(6)
第244回 RAMBUSのTBI(5)
第243回 RAMBUSのTBI(4)
第242回 RAMBUSのTBI(3)
第241回 RAMBUSのTBI(2)
第240回 RAMBUSのTBI(1)
第239回 OS小論:OSの構造をもう少し考えてみる(45)
第238回 OS小論:OSの構造をもう少し考えてみる(44)
第237回 OS小論:OSの構造をもう少し考えてみる(43)
第236回 OS小論:OSの構造をもう少し考えてみる(42)
第235回 OS小論:OSの構造をもう少し考えてみる(41)
第234回 OS小論:OSの構造をもう少し考えてみる(40)
第233回 OS小論:OSの構造をもう少し考えてみる(39)
第232回 OS小論:OSの構造をもう少し考えてみる(38)
第231回 OS小論:OSの構造をもう少し考えてみる(37)
第230回 OS小論:OSの構造をもう少し考えてみる(36)
第229回 OS小論:OSの構造をもう少し考えてみる(35)
第228回 OS小論:OSの構造をもう少し考えてみる(34)
第227回 OS小論:OSの構造をもう少し考えてみる(33)
第226回 OS小論:OSの構造をもう少し考えてみる(32)
第225回 OS小論:OSの構造をもう少し考えてみる(31)
第224回 OS小論:OSの構造をもう少し考えてみる(30)
第223回 OS小論:OSの構造をもう少し考えてみる(29)
第222回 OS小論:OSの構造をもう少し考えてみる(28)
第221回 OS小論:OSの構造をもう少し考えてみる(27)
第220回 OS小論:OSの構造をもう少し考えてみる(26)
第219回 OS小論:OSの構造をもう少し考えてみる(25)
第218回 OS小論:OSの構造をもう少し考えてみる(24)
第217回 OS小論:OSの構造をもう少し考えてみる(23)
第216回 OS小論:OSの構造をもう少し考えてみる(22)
第215回 OS小論:OSの構造をもう少し考えてみる(21)
第214回 OS小論:OSの構造をもう少し考えてみる(20)
第213回 OS小論:OSの構造をもう少し考えてみる(19)
第212回 OS小論:OSの構造をもう少し考えてみる(18)
第211回 OS小論:OSの構造をもう少し考えてみる(17)
第210回 OS小論:OSの構造をもう少し考えてみる(16)
第209回 OS小論:OSの構造をもう少し考えてみる(15)
第208回 OS小論:OSの構造をもう少し考えてみる(14)
第207回 OS小論:OSの構造をもう少し考えてみる(13)
第206回 OS小論:OSの構造をもう少し考えてみる(12)
第205回 OS小論:OSの構造をもう少し考えてみる(11)
第204回 OS小論:OSの構造をもう少し考えてみる(10)
第203回 OS小論:OSの構造をもう少し考えてみる(9)
第202回 OS小論:OSの構造をもう少し考えてみる(8)
第201回 OS小論:OSの構造をもう少し考えてみる(7)
第200回 OS小論:OSの構造をもう少し考えてみる(6)
第199回 OS小論:OSの構造をもう少し考えてみる(5)
第198回 OS小論:OSの構造をもう少し考えてみる(4)
第197回 OS小論:OSの構造をもう少し考えてみる(3)
第196回 OS小論:OSの構造をもう少し考えてみる(2)
第195回 OS小論:OSの構造をもう少し考えてみる(1)
第194回 Core MicroArchitectureをもうすこし(18)
第193回 Core MicroArchitectureをもうすこし(17)
第192回 Core MicroArchitectureをもうすこし(16)
第191回 Core MicroArchitectureをもうすこし(15)
第190回 Core MicroArchitectureをもうすこし(14)
第189回 Core MicroArchitectureをもうすこし(13)
第188回 Core MicroArchitectureをもうすこし(12)
第187回 Core MicroArchitectureをもうすこし(11)
第186回 Core MicroArchitectureをもうすこし(10)
第185回 Core MicroArchitectureをもうすこし(9)
第184回 Core MicroArchitectureをもうすこし(8)
第183回 Core MicroArchitectureをもうすこし(7)
第182回 Core MicroArchitectureをもうすこし(6)
第181回 Core MicroArchitectureをもうすこし(5)
第180回 Core MicroArchitectureをもうすこし(4)
第179回 Core MicroArchitectureをもうすこし(3)
第178回 Core MicroArchitectureをもうすこし(2)
第177回 Core MicroArchitectureをもうすこし(1)
第176回 バスのアーキテクチャ - 過去から未来へ(137)
第175回 バスのアーキテクチャ - 過去から未来へ(136)
第174回 バスのアーキテクチャ - 過去から未来へ(135)
第173回 バスのアーキテクチャ - 過去から未来へ(134)
第172回 バスのアーキテクチャ - 過去から未来へ(133)
第171回 バスのアーキテクチャ - 過去から未来へ(132)
第170回 バスのアーキテクチャ - 過去から未来へ(131)
第169回 バスのアーキテクチャ - 過去から未来へ(130)
第168回 バスのアーキテクチャ - 過去から未来へ(129)
第167回 バスのアーキテクチャ - 過去から未来へ(128)
第166回 バスのアーキテクチャ - 過去から未来へ(127)
第165回 バスのアーキテクチャ - 過去から未来へ(126)
第164回 バスのアーキテクチャ - 過去から未来へ(125)
第163回 バスのアーキテクチャ - 過去から未来へ(124)
第162回 バスのアーキテクチャ - 過去から未来へ(123)
第161回 バスのアーキテクチャ - 過去から未来へ(122)
第160回 バスのアーキテクチャ - 過去から未来へ(121)
第159回 バスのアーキテクチャ - 過去から未来へ(120)
第158回 バスのアーキテクチャ - 過去から未来へ(119)
第157回 バスのアーキテクチャ - 過去から未来へ(118)
第156回 バスのアーキテクチャ - 過去から未来へ(117)
第155回 バスのアーキテクチャ - 過去から未来へ(116)
第154回 バスのアーキテクチャ - 過去から未来へ(115)
第153回 バスのアーキテクチャ - 過去から未来へ(114)
第152回 バスのアーキテクチャ - 過去から未来へ(113)
第151回 バスのアーキテクチャ - 過去から未来へ(112)
第150回 バスのアーキテクチャ - 過去から未来へ(111)
第149回 バスのアーキテクチャ - 過去から未来へ(110)
第148回 バスのアーキテクチャ - 過去から未来へ(109)
第147回 バスのアーキテクチャ - 過去から未来へ(108)
第146回 バスのアーキテクチャ - 過去から未来へ(107)
第145回 バスのアーキテクチャ - 過去から未来へ(106)
第144回 バスのアーキテクチャ - 過去から未来へ(105)
第143回 バスのアーキテクチャ - 過去から未来へ(104)
第142回 バスのアーキテクチャ - 過去から未来へ(103)
第141回 バスのアーキテクチャ - 過去から未来へ(102)
第140回 バスのアーキテクチャ - 過去から未来へ(101)
第139回 バスのアーキテクチャ - 過去から未来へ(100)
第138回 バスのアーキテクチャ - 過去から未来へ(99)
第137回 バスのアーキテクチャ - 過去から未来へ(98)
第136回 バスのアーキテクチャ - 過去から未来へ(97)
第135回 バスのアーキテクチャ - 過去から未来へ(96)
第134回 バスのアーキテクチャ - 過去から未来へ(95)
第133回 バスのアーキテクチャ - 過去から未来へ(94)
第132回 バスのアーキテクチャ - 過去から未来へ(93)
第131回 バスのアーキテクチャ - 過去から未来へ(92)
第130回 バスのアーキテクチャ - 過去から未来へ(91)
第129回 バスのアーキテクチャ - 過去から未来へ(90)
第128回 バスのアーキテクチャ - 過去から未来へ(89)
第127回 バスのアーキテクチャ - 過去から未来へ(88)
第126回 バスのアーキテクチャ - 過去から未来へ(87)
第125回 バスのアーキテクチャ - 過去から未来へ(86)
第124回 バスのアーキテクチャ - 過去から未来へ(85)
第123回 バスのアーキテクチャ - 過去から未来へ(84)
第122回 バスのアーキテクチャ - 過去から未来へ(83)
第121回 バスのアーキテクチャ - 過去から未来へ(82)
第120回 バスのアーキテクチャ - 過去から未来へ(81)
第119回 バスのアーキテクチャ - 過去から未来へ(80)
第118回 バスのアーキテクチャ - 過去から未来へ(79)
第117回 バスのアーキテクチャ - 過去から未来へ(78)
第116回 バスのアーキテクチャ - 過去から未来へ(77)
第115回 バスのアーキテクチャ - 過去から未来へ(76)
第114回 バスのアーキテクチャ - 過去から未来へ(75)
第113回 バスのアーキテクチャ - 過去から未来へ(74)
第112回 バスのアーキテクチャ - 過去から未来へ(73)
第111回 バスのアーキテクチャ - 過去から未来へ(72)
第110回 バスのアーキテクチャ - 過去から未来へ(71)
第109回 バスのアーキテクチャ - 過去から未来へ(70)
第108回 バスのアーキテクチャ - 過去から未来へ(69)
第107回 バスのアーキテクチャ - 過去から未来へ(68)
第106回 バスのアーキテクチャ - 過去から未来へ(67)
第105回 バスのアーキテクチャ - 過去から未来へ(66)
第104回 バスのアーキテクチャ - 過去から未来へ(65)
第103回 バスのアーキテクチャ - 過去から未来へ(64)
第102回 バスのアーキテクチャ - 過去から未来へ(63)
第101回 バスのアーキテクチャ - 過去から未来へ(62)
第100回 バスのアーキテクチャ - 過去から未来へ(61)
第99回 バスのアーキテクチャ - 過去から未来へ(60)
第98回 バスのアーキテクチャ - 過去から未来へ(59)
第97回 バスのアーキテクチャ - 過去から未来へ(58)
第96回 バスのアーキテクチャ - 過去から未来へ(57)
第95回 バスのアーキテクチャ - 過去から未来へ(56)
第94回 バスのアーキテクチャ - 過去から未来へ(55)
第93回 バスのアーキテクチャ - 過去から未来へ(54)
第92回 バスのアーキテクチャ - 過去から未来へ(53)
第91回 バスのアーキテクチャ - 過去から未来へ(52)
第90回 バスのアーキテクチャ - 過去から未来へ(51)
第89回 バスのアーキテクチャ - 過去から未来へ(50)
第88回 バスのアーキテクチャ - 過去から未来へ(49)
第87回 バスのアーキテクチャ - 過去から未来へ(48)
第86回 バスのアーキテクチャ - 過去から未来へ(47)
第85回 バスのアーキテクチャ - 過去から未来へ(46)
第84回 バスのアーキテクチャ - 過去から未来へ(45)
第83回 バスのアーキテクチャ - 過去から未来へ(44)
第82回 バスのアーキテクチャ - 過去から未来へ(43)
第81回 バスのアーキテクチャ - 過去から未来へ(42)
第80回 バスのアーキテクチャ - 過去から未来へ(41)
第79回 バスのアーキテクチャ - 過去から未来へ(40)
第78回 バスのアーキテクチャ - 過去から未来へ(39)
第77回 バスのアーキテクチャ - 過去から未来へ(38)
第76回 バスのアーキテクチャ - 過去から未来へ(37)
第75回 バスのアーキテクチャ - 過去から未来へ(36)
第74回 バスのアーキテクチャ - 過去から未来へ(35)
第73回 バスのアーキテクチャ - 過去から未来へ(34)
第72回 バスのアーキテクチャ - 過去から未来へ(33)
第71回 バスのアーキテクチャ - 過去から未来へ(32)
第70回 バスのアーキテクチャ - 過去から未来へ(31)
第69回 バスのアーキテクチャ - 過去から未来へ(30)
第68回 バスのアーキテクチャ - 過去から未来へ(29)
第67回 バスのアーキテクチャ - 過去から未来へ(28)
第66回 バスのアーキテクチャ - 過去から未来へ(27)
第65回 バスのアーキテクチャ - 過去から未来へ(26)
第64回 バスのアーキテクチャ - 過去から未来へ(25)
第63回 バスのアーキテクチャ - 過去から未来へ(24)
第62回 バスのアーキテクチャ - 過去から未来へ(23)
第61回 バスのアーキテクチャ - 過去から未来へ(22)
第60回 バスのアーキテクチャ - 過去から未来へ(21)
第59回 バスのアーキテクチャ - 過去から未来へ(20)
第58回 バスのアーキテクチャ - 過去から未来へ(19)
第57回 バスのアーキテクチャ - 過去から未来へ(18)
第56回 バスのアーキテクチャ - 過去から未来へ(17)
第55回 バスのアーキテクチャ - 過去から未来へ(16)
第54回 バスのアーキテクチャ - 過去から未来へ(15)
第53回 バスのアーキテクチャ - 過去から未来へ(14)
第52回 バスのアーキテクチャ - 過去から未来へ(13)
第51回 バスのアーキテクチャ - 過去から未来へ(12)
第50回 バスのアーキテクチャ - 過去から未来へ(11)
第49回 バスのアーキテクチャ - 過去から未来へ(10)
第48回 バスのアーキテクチャ - 過去から未来へ(9)
第47回 バスのアーキテクチャ - 過去から未来へ(8)
第46回 バスのアーキテクチャ - 過去から未来へ(7)
第45回 バスのアーキテクチャ - 過去から未来へ(6)
第44回 バスのアーキテクチャ - 過去から未来へ(5)
第43回 バスのアーキテクチャ - 過去から未来へ(4)
第42回 バスのアーキテクチャ - 過去から未来へ(3)
第41回 バスのアーキテクチャ - 過去から未来へ(2)
第40回 バスのアーキテクチャ - 過去から未来へ(1)
第39回 NuCORE Image Processor - Embedded Processorの一断層(8)
第38回 NuCORE Image Processor - Embedded Processorの一断層(7)
第37回 NuCORE Image Processor - Embedded Processorの一断層(6)
第36回 NuCORE Image Processor - Embedded Processorの一断層(5)
第35回 NuCORE Image Processor - Embedded Processorの一断層(4)
第34回 NuCORE Image Processor - Embedded Processorの一断層(3)
第33回 NuCORE Image Processor - Embedded Processorの一断層(2)
第32回 NuCORE Image Processor - Embedded Processorの一断層(1)
第31回 パーソナルな64bit環境はいつ手に入る?
第30回 64bit Rhapsody 新しい地平を切り開くItanium(10)
第29回 64bit Rhapsody 新しい地平を切り開くItanium(9)
第28回 64bit Rhapsody 新しい地平を切り開くItanium(8)
第27回 64bit Rhapsody 新しい地平を切り開くItanium(7)
第26回 64bit Rhapsody 新しい地平を切り開くItanium(6)
第25回 64bit Rhapsody 新しい地平を切り開くItanium(5)
第24回 64bit Rhapsody 新しい地平を切り開くItanium(4)
第23回 64bit Rhapsody 新しい地平を切り開くItanium(3)
第22回 64bit Rhapsody 新しい地平を切り開くItanium(2)
第21回 64bit Rhapsody 新しい地平を切り開くItanium(1)
第20回 64bit Rhapsody OSを持たないハードウェアの悲劇(4)
第19回 64bit Rhapsody OSを持たないハードウェアの悲劇(3)
第18回 64bit Rhapsody OSを持たないハードウェアの悲劇(2)
第17回 64bit Rhapsody OSを持たないハードウェアの悲劇
第16回 64bit Rhapsody IA-32とYamhill(5)
第15回 64bit Rhapsody IA-32とYamhill(4)
第14回 64bit Rhapsody IA-32とYamhill(3)
第13回 64bit Rhapsody IA-32とYamhill(2)
第12回 64bit Rhapsody IA-32とYamhill(1)
第11回 64bit Rhapsody Hammerの理想と現実(7)
第10回 64bit Rhapsody Hammerの理想と現実(6)
第9回 64bit Rhapsody Hammerの理想と現実(5)
第8回 64bit Rhapsody Hammerの理想と現実(4)
第7回 64bit Rhapsody Hammerの理想と現実(3)
第6回 64bit Rhapsody Hammerの理想と現実(2)
第5回 64bit Rhapsody Hammerの理想と現実(1)
第4回 64bit Rhapsody それでもある64bitの需要(2)
第3回 64bit Rhapsody それでもある64bitの需要(1)
第2回 64bit Rhapsody 一人歩きする64bit(2)
第1回 64bit Rhapsody 一人歩きする64bit(1)

もっと見る

人気記事

一覧

新着記事

[朝が来る]テレビ欄に原作・辻村深月の作品名 「“辻村愛”感じて」 安田成美&川島海荷のヒューマンドラマ
[08:00 7/30] エンタメ
偽Pokemon GOアプリから身を守る方法
[08:00 7/30] 企業IT
ベッキー、武道館イベントに感激「ただただ幸せ」騒動後初めてファンの前に
[08:00 7/30] エンタメ
吉木りさ&和田正人、ブログで交際宣言「あたたかい目で見守って」
[08:00 7/30] エンタメ
鉄道トリビア 第365回 全国に4駅ある赤坂駅と愛媛県の五十崎駅、その共通点は…
[08:00 7/30] ホビー