เมื่อวานว่างๆ เลยลองหาวิธีเขียนโปรแกรมที่ใช้ 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:
Post a Comment