15 November 2004

MMX & SSE

เมื่อวานว่างๆ เลยลองหาวิธีเขียนโปรแกรมที่ใช้ MMX กับ SSE เพื่อประมวลผลเวคเตอร์ ลองหาคู่มือของ gcc ดู ก็พบว่าสนับสนุน MMX กับ SSE แล้ว ส่วน SSE2 เพิ่งเริ่มใช้ได้ในเวอร์ชัน 3.4 วิธีเขียนโปรแกรมก็ไม่ยาก ลองดูตัวอย่างจาก http://ds9a.nl/gcc-simd/ แล้วลองเขียนโปรแกรมหาค่า Euclidean distance แบบง่ายๆ ดู

#include <stdio.h>
#include <math.h>

typedef float v4sf __attribute__ ((mode(V4SF)));

union float4 {
  v4sf v;
  float f[4];
};

main() {
  float4 x,y,z;
  float d,d2;

  z.v = (x.v - y.v) * (x.v - y.v);
  d2 = 0.0;
  for(int i=0; i<4; i++)
    d2+=z.f[i];
  d =sqrt(d2);
}

วิธีกำหนดให้ใข้เวคเตอร์ ก็แค่ใส่ __attribute__ ไว้หลัง typedef ส่วน V4SF ก็คือเวคเตอร์ของ float จำนวน 4 ตัว เวลากำหนดค่าแต่ละตัวก็ใช้ union ร่วมกับอะเรย์เอา เวลาคำนวณก็ง่าย เพราะใช้ operator เหมือนเดิม (ที่จริงมีฟังก์ชันเฉพาะด้วย) ส่วนถ้าอยากจะใช้ตัวแปรแบบอื่น เช่น int ก็เปลี่ยน mode เป็น V4SI ได้ ถ้าจะใช้ double ก็ใช้ V4DF (แต่ว่า double นี้จะสนับสนุนในเวอร์ชัน 3.4 ขึ่นไปเท่านั้น) ต่อไปก็ต้องลองเทียบเวลาดู เวลาเร็วกว่ากันเยอะไหม

No comments: