Saturday, August 07, 2004

Crusoe ช้าหรือเร็ว: Benchmark กับความเป็นจริง

จากประสบการณ์

BenchMark: ยอมรับได้
ความเป็นจริง: มันช้ามาก

ความเป็นมา

ที่บ้านมีคอมพิวเตอร์ที่ใช้ชิป Crusoe ของ Transmeta อยู่ตัวหนึ่ง เป็นคอมพิวเตอร์ Notebook เล็กๆของ SONY ตระกูล PictureBook รุ่น PCG-C1VR/BP ซื้อมาได้ 3-4 ปีแล้ว

ตระกูล PictureBook นี่อยากได้มาตั้งแต่ใช้ Pentium-II แล้ว แต่ราคายังค่อนข้างสูง มีรุ่นนี้แหละที่ลดลงมาฮวบฮาบ ตอนนั้นเห็นราคาแล้วไม่คิดไรมาก ซื้อเลย ตัว Crusoe มันจะเป็นยังไง ไม่สนใจมาก อย่างน้อยมันก็ 600MHz น่าจะเร็วกว่า Desktop ที่บ้าน (P2-266) ดู Benchmark ฯลฯ ก็ไม่แย่นัก ความอยากลองมันเข้าครอบงำ

เอามาเล่น มันช้ากว่าที่คิดค่อนข้างเยอะ อะไรๆก็ดูอืดไปหมด เปิดโปรแกรม IE รอนานมาก จนดูเหมือนน่าจะช้ากว่า P2-266 ที่บ้าน ลองซื้อ RAM มาใส่จนเต็มที่ 192MB ก็ไม่ดีขึ้นเท่าไร

ชักสงสัยว่าเป็นเพราะอะไร เอาโปรแกรม hdbench มารัน เปรียบเทียบกับ Pentium-III 600MHz


ThinkPad s30: P3-600MHz, 256MB, Lynx3DM 1024x768x16


SONY PictureBook PCG-C1VR/BP, Crusoe TM5400-600, 192MB, ATI RAGE Mobilty-M1, 1024x480

เทียบอัตราส่วนดู Integer น่าจะเท่ากับ P3-444MHz, ส่วน Float ก็ประมาณ P3-300MHz อยู่ในระดับที่น่าจะพอใช้งานได้ ! ความเร็ว Memory, HardDisk หรือ Graphic ก็ไม่ด้อยไปกว่ากัน

หรือว่าเป็นเพราะ Windows มันอืด ?

ลองแบ่ง Partition เอา Linux มาทดสอบ ติดตั้ง Fedora Core I เข้าไป มันก็ยังอืด ! เรียก startx ทีไปกินกาแฟรอได้เลย ! พวก GNome/KDE ไม่อยากจะเล่น ต้องเล่นแค่ xinit+twm. Mozilla ยังไม่ค่อยอยากจะเรียก

ตกลงเลยไม่ได้ใช้งานเท่าไร

เมื่อวาน

เอาเครื่องมาปัดฝุ่น ลองทดสอบ Benchmark อีกทีโดยใช้โปรแกรม PiBench พอดีมีตัวเลขให้เปรียบเทียบเยอะ ลองเทียบกับ Celeron-400 ตัวเก่าที่ลง Fedora ไว้เหมือนกัน
CELERON-400$ time ./huibench
Pi 3.141593
1.410u 0.010s 0:01.41 100.7%    0+0k 0+0io 86pf+0w

CRUSOE-600$ time ./foo
Pi 3.141593
1.290u 0.000s 0:01.28 100.7%    0+0k 0+0io 88pf+0w
ดูจากตัวเลข Crusoe-600 น่าจะเร็วกว่า Celeron-400 อีก (ประมาณ Celeron 440MHz) แต่ในความเป็นจริง Celeron-400 เล่น Linux ยังทนเล่นได้ แต่ Crusoe-600 ไม่อยากเล่นเลย

คงเป็นเพราะ Code Morphing ของ Crusoe มัน cache โปรแกรมที่แปลงจาก x86 เป็นคำสั่งของ Crusoe เองเอาไว้ พวกโปรแกรม Benchmark ทั้งหลายที่มีขนาด Code เล็กๆ ก็เลยทำงานได้ดี

แต่พอเปิดโปรแกรมโตๆหลายๆโปรแกรม เช่น startx ความเร็วมันก็เลยตกลงไปเยอะ เพราะ cache ช่วยอะไรไม่ได้มาก เจอคำสั่งอะไรก็ต้องมาแปลงใหม่หมด

อยากจะทดลองให้เห็นจะๆ ก็เลยเอาโปรแกรม PiBench มาแก้เป็น

  for(i=0;i<2500;i++) {
    /* 2500 Repeat 3,000 times */
    x += 1.0/j - 1.0/(j+2); j+=4;
    ... 3000 lines ...
    x += 1.0/j - 1.0/(j+2); j+=4;
  }
คือลดลูปลง ในแต่ละลูปเขียนคำสั่งเหมือนๆกัน 3000 บรรทัด ปริมาณงานที่ทำเท่าเดิม แต่แกล้งทำให้โปรแกรมมันโตขึ้นมากๆ

ผลบน Celeron-400

CELERON-400$ time ./huibench-3000
Pi 3.141593
1.530u 0.000s 0:01.50 102.0%    0+0k 0+0io 116pf+0w
ไม่เปลี่ยนแปลงมาก ช้ากว่าเมื่อกี้ (1.41) หน่อยนึง คงเป็นเพราะโปรแกรมโตเกิน instruction cache ของ Celeron เหมือนกัน

ผลบน Crusoe-600

CRUSOE-600$ time ./huibench-3000
Pi 3.141593
36.990u 0.010s 0:36.99 100.0%   0+0k 0+0io 118pf+0w
Crusoe กลายเป็นเต่าไปเลย ช้าลง 28 เท่า ! ช้ากว่า Celeron-400 ชนิดไม่เห็นฝุ่น (ประมาณ Celeron 17MHz) ที่น่าสนใจคือ เมื่อลองหลายๆครั้ง
CRUSOE-600$ time ./huibench-3000
Pi 3.141593
22.220u 0.000s 0:22.21 100.0%   0+0k 0+0io 118pf+0w

CRUSOE-600$ time ./huibench-3000
Pi 3.141593
7.440u 0.000s 0:07.43 100.1%    0+0k 0+0io 118pf+0w

CRUSOE-600$ time ./huibench-3000
Pi 3.141593
2.160u 0.000s 0:02.15 100.4%    0+0k 0+0io 118pf+0w

CRUSOE-600$ time ./huibench-3000
Pi 3.141593
2.160u 0.010s 0:02.15 100.9%    0+0k 0+0io 118pf+0w

CRUSOE-600$ time ./huibench-3000
Pi 3.141593
2.140u 0.010s 0:02.14 100.4%    0+0k 0+0io 118pf+0w
มันเร็วขึ้นเรื่อยๆ จนหยุดที่ 2.14 ช้ากว่า Celeron-400 อยู่ดี (ประมาณ Celeron 285MHz) ลองแกล้งเปลี่ยนชื่อไฟล์โปรแกรม
CRUSOE-600$ mv huibench-3000 foo-3000

CRUSOE-600$ time ./foo-3000 
Pi 3.141593
2.150u 0.010s 0:02.15 100.4%    0+0k 0+0io 118pf+0w
ความเร็วไม่เปลี่ยนแปลง ซึ่งก็ควรจะเป็นเช่นนั้น เพราะ Code Morphing มันคง cache ที่ระดับ CPU ไม่เกี่ยวกับชื่อโปรแกรม/OS แต่พอทดลอง copy ไฟล์
CRUSOE-600$ cp foo-3000 foo-3000-2

CRUSOE-600$ time ./foo-3000-2 
Pi 3.141593
37.070u 0.000s 0:37.06 100.0%   0+0k 0+0io 118pf+0w

CRUSOE-600$ time ./foo-3000-2
Pi 3.141593
22.880u 0.010s 0:22.88 100.0%   0+0k 0+0io 118pf+0w
ความเร็วมันตกไปที่ 37 วินาทีอีกแล้ว ! รันโปรแกรมที่มี Binary หน้าตาเหมือนเดิม แต่ Copy ไปอีกไฟล์นึง แสดงว่า Code Morphing มันคิดว่าเป็นคนละโปรแกรม ? Crusoe มันไม่ได้ดูเฉพาะที่ code ที่เข้ามา แต่อาศัย Hint อะไรบางอย่างจาก OS ด้วย ?

กลับไปลองโปรแกรมเดิม

CRUSOE-600$ time ./foo-3000
Pi 3.141593
2.140u 0.010s 0:02.14 100.4%    0+0k 0+0io 118pf+0w
ความเร็วก็ยังไม่ตก (ยังอยู่ใน cache ?)

ยังเป็นปริศนาอยู่ว่า

  • รัน startx หลายๆทีจะเร็วขึ้นไหมเนี่ย ?
  • โปรแกรมเล็ก ทำไมมันเร็วอยู่แล้ว ?
  • โปรแกรมโต ทำไมรันหลายๆครั้งจึงจะเร็วขึ้น ?

หมายเหตุ

เจอเรื่องแปลกของ gcc อย่างหนึ่ง ก่อนที่จะใช้คำสั่งเดียวกัน 3,000 บรรทัด ทดลองใช้ 30,000 บรรทัด (เพราะอยากให้ได้ binary ออกมาสัก 1MB ซึ่งน่าจะเกินขนาด cache ของ Crusoe) ปรากฏว่า
$time gcc -O2 -o huibench-huge huibench-huge.c 
cc1: out of memory allocating 2812893760 bytes after a total of 17616896 bytes
7676.542u 5.068s 2:08:04.07 99.9%       0+0k 0+0io 40pf+0w
บนเครื่อง Xeon 2.4GHz ผ่านไปสองชั่วโมงมันขึ้น out-of-memory ข้างต้น สงสัยมัวแต่พยายาม Optimize หรือทำอะไรสักอย่าง แทนที่จะแปลคำสั่งเดิมๆ 30,000 บรรทัดตรงๆ

2 comments:

Oui said...

เคยอยากได้เหมือนกันครับ เห็นแล้ว รุ่นนี้เท่มาก อยากได้มาก ๆ เพราะตัวมันเล็ก แต่พออ่านผลทดสอบ ชักเปลี่ยนใจ เคยมีประสบการณ์เลวร้ายกับ chip cyrix มาแล้ว ตั้งแต่นี้ ถ้าไม่ใช่ intel คงไม่กล้าไปลองอันอื่นแล้วล่ะครับ

modeller said...

เขียนได้น่าสนใจ