ใน 16.1 รหัสนี้ทํางานตามที่คาดหวังเมื่อลูปด้านนอกถูกอนุกรมเนื่องจากการขึ้นต่อกันและการขึ้นต่อกันของลูปด้านในถูกลบโดย ivdep #pragma
ลูปนี้จะถูกอนุกรมเนื่องจากการขึ้นต่อกันอย่างแท้จริงกับลูปด้านใน
สําหรับ (อักขระไม่มีลายเซ็น x = 0; x < 4; x ) {
ลูปด้านในไม่มีการอ้างอิงระหว่างการคํานวณซ้ํา แต่ขึ้นอยู่กับลูปด้านนอก
ivdep #pragma
สําหรับ (อักขระ y ที่ไม่มีการรับรอง = 0; y<64; y ) {
ใน 17.0 ตอนนี้ #pragma ivdep จะถูกนําไปใช้กับทั้งลูปด้านในและภายนอกดังนั้นการขึ้นต่อกันในลูปด้านนอกจะไม่ได้รับการลงบัญชีโดยคอมไพเลอร์ ส่งผลให้รหัสที่คล้ายกันอาจทํางานไม่ถูกต้องในฮาร์ดแวร์ที่ทํางานในการจําลอง
แก้ ปัญหา:
1. เพิ่ม "dummy" ที่เพิ่มเข้ามาในเคอร์เนลเพิ่มเติม ในด้านโฮสต์ ให้ส่ง 1 สําหรับข้อสรุปของหุ่นนี้เสมอ
ก่อน
my_kernelเป็นโมฆะ__kernel(
อินพุตจํากัด__global cpx_t*
ผลลัพธ์การจํากัด __global cpx_t*)
หลัง
my_kernelเป็นโมฆะ__kernel(
อินพุตจํากัด__global cpx_t*
ผลลัพธ์การจํากัด __global cpx_t*
int dummy)
2. ในลูปที่ตรงกลาง ให้ห่อหุ้มลูปด้านในใน "if (dummy)":
ลูปนี้จะถูกอนุกรมเนื่องจากการขึ้นต่อกันอย่างแท้จริง
สําหรับ (อักขระไม่มีลายเซ็น x = 0; x < 4; x ) {
if (dummy) {
ไม่มีการขึ้นต่อกันภายในแต่ละชุดของ 64 ครั้ง
ivdep #pragma
สําหรับ (อักขระ y ที่ไม่มีการรับรอง = 0; y<64; y ) {
ปัญหานี้ได้รับการกําหนดเวลาให้แก้ไขใน Intel© OpenCL™ เวอร์ชันในอนาคตสําหรับ SDK FPGA