ในแง่กว้างอัลกอริธึมที่ทำงานเร็วกว่าบน GPU เป็นสิ่งที่คุณกำลังทำการสอนชนิดเดียวกันในจุดข้อมูลที่แตกต่างกัน
ตัวอย่างง่ายๆในการอธิบายนี้คือการคูณเมทริกซ์
สมมติว่าเรากำลังทำการคำนวณเมทริกซ์
A × B = C
อัลกอริทึมของ CPU อย่างง่ายอาจมีลักษณะคล้าย
// เริ่มต้นด้วย C = 0
for (int i = 0; i < C_Width; i++)
{
for (int j = 0; j < C_Height; j++)
{
for (int k = 0; k < A_Width; k++)
{
for (int l = 0; l < B_Height; l++)
{
C[j, i] += A[j, k] * B[l, i];
}
}
}
}
สิ่งสำคัญที่ต้องดูที่นี่คือมีหลายระดับซ้อนกันสำหรับลูปและแต่ละขั้นตอนจะต้องดำเนินการอย่างใดอย่างหนึ่งหลังจากที่อื่น
ดูแผนภาพของสิ่งนี้
ขอให้สังเกตว่าการคำนวณของแต่ละองค์ประกอบของ C ไม่ได้ขึ้นอยู่กับองค์ประกอบอื่น ๆ ดังนั้นจึงไม่สำคัญว่าจะทำการคำนวณตามลำดับใด
ดังนั้นใน GPU การดำเนินการเหล่านี้สามารถทำได้พร้อมกัน
เคอร์เนล GPU สำหรับการคำนวณการคูณเมทริกซ์จะมีลักษณะเป็นอย่างไร
__kernel void Multiply
(
__global float * A,
__global float * B,
__global float * C
)
{
const int x = get_global_id(0);
const int y = get_global_id(1);
for (int k = 0; k < A_Width; k++)
{
for (int l = 0; l < B_Height; l++)
{
C[x, y] += A[x, k] * B[l, y];
}
}
}
เคอร์เนลนี้มีสองด้านสำหรับลูปเท่านั้น โปรแกรมที่ส่งงานนี้ไปยัง GPU จะบอกให้ GPU ดำเนินการเคอร์เนลนี้สำหรับแต่ละจุดข้อมูลใน C GPU จะทำตามคำแนะนำเหล่านี้พร้อมกันในหลายเธรด เช่นเดียวกับคำพูดเก่า ๆ ที่ว่า "ถูกกว่าด้วยโหล" GPU ได้รับการออกแบบมาให้ทำสิ่งเดียวกันได้เร็วขึ้นหลายครั้ง
อย่างไรก็ตามมีอัลกอริทึมบางตัวที่จะทำให้ GPU ช้าลง บางตัวไม่เหมาะสำหรับ GPU
ตัวอย่างเช่นหากมีการพึ่งพาข้อมูลคือ: จินตนาการการคำนวณของแต่ละองค์ประกอบของ C ขึ้นอยู่กับองค์ประกอบก่อนหน้า โปรแกรมเมอร์จะต้องใส่สิ่งกีดขวางในเคอร์เนลเพื่อรอให้การคำนวณก่อนหน้านี้เสร็จสิ้น นี่จะเป็นการชะลอตัวครั้งใหญ่
นอกจากนี้อัลกอริทึมที่มีตรรกะการแยกย่อยมากมายเช่น:
__kernel Foo()
{
if (somecondition)
{
do something
}
else
{
do something completely different
}
}
มักจะทำงานช้าลงบน GPU เพราะ GPU ไม่ทำสิ่งเดียวกันในแต่ละเธรดอีกต่อไป
นี่เป็นคำอธิบายที่ง่ายขึ้นเนื่องจากมีปัจจัยอื่นอีกมากมายที่ต้องพิจารณา ตัวอย่างเช่นการส่งข้อมูลระหว่าง CPU และ GPU นั้นใช้เวลานานเช่นกัน บางครั้งมันก็คุ้มค่าที่จะทำการคำนวณบน GPU แม้ว่ามันจะเร็วกว่าบนซีพียูเพียงเพื่อหลีกเลี่ยงเวลาส่งเพิ่ม (และในทางกลับกัน)
ซีพียูสมัยใหม่หลายรุ่นรองรับการทำงานพร้อมกันในขณะนี้พร้อมกับโปรเซสเซอร์มัลติคอร์แบบหลายเธรด
GPU ดูเหมือนจะไม่ดีสำหรับการเรียกดูอีกครั้งดูที่นี่ซึ่งอาจอธิบายปัญหาบางอย่างเกี่ยวกับอัลกอริทึม QR ฉันเชื่อว่ามีการอ้างอิงข้อมูลซ้ำ