การสร้างระบบหน่วยความจำที่แตกต่างกันใน FPGA SDK สำหรับแพลตฟอร์มที่กำหนดเองของ OpenCL
คำแนะนำ
การสร้างระบบหน่วยความจำที่แตกต่างกันใน Intel® FPGA SDK สำหรับแพลตฟอร์ม OpenCL แบบกำหนดเอง
การใช้หน่วยความจำต่างกันในแพลตฟอร์มแบบกำหนดเองช่วยให้มีแบนด์วิธอินเทอร์เฟซหน่วยความจำภายนอก (EMIF) ได้มากขึ้น รวมถึงการเข้าถึงหน่วยความจำที่ใหญ่ขึ้นและเร็วขึ้น การรวมกันของการเข้าถึงหน่วยความจำที่แตกต่างกันที่มีการเพิ่มประสิทธิภาพ
เคอร์เนล OpenCL ™(1) สามารถส่งผลให้ระบบ OpenCL ของคุณได้รับการปรับปรุงประสิทธิภาพอย่างมีนัยสำคัญ
หมายเหตุแอปพลิเคชันนี้ให้คำแนะนำในการสร้างระบบหน่วยความจำที่แตกต่างกันในแพลตฟอร์มที่กำหนดเองเพื่อใช้กับ Intel® FPGA SDK สำหรับ OpenCL(2) Intel ถือว่าคุณเป็นนักออกแบบ FPGA ที่มีประสบการณ์ซึ่งกำลังพัฒนาแพลตฟอร์มแบบกำหนดเองที่ประกอบด้วยระบบหน่วยความจำที่ต่างกัน
ก่อนที่จะสร้างระบบหน่วยความจำต่างกัน ให้ทำความคุ้นเคยกับเอกสาร Intel FPGA SDK สำหรับ OpenCL ที่ระบุด้านล่าง
ข้อมูลที่เกี่ยวข้อง
- Intel FPGA SDK สำหรับคู่มือการเขียนโปรแกรม OpenCL
- Intel FPGA SDK สำหรับแนวทางปฏิบัติที่ดีที่สุดของ OpenCL
- คู่มือการย้ายแพลตฟอร์มอ้างอิงชุดพัฒนา OpenCL Arria 10 GX FPGA Intel FPGA SDK
1.1. การตรวจสอบการทำงานของบอร์ด FPGA และอินเทอร์เฟซ EMIF
ตรวจสอบอินเทอร์เฟซหน่วยความจำแต่ละรายการแยกกัน จากนั้นสร้างอินสแตนซ์แพลตฟอร์มแบบกำหนดเองของคุณโดยใช้หน่วยความจำส่วนกลาง
- ตรวจสอบแต่ละอินเทอร์เฟซหน่วยความจำโดยใช้การออกแบบฮาร์ดแวร์ที่สามารถทดสอบความเร็วและความเสถียรของแต่ละอินเทอร์เฟซ
- สร้างอินสแตนซ์ Custom Platform ของคุณโดยใช้หน่วยความจำส่วนกลาง
- เช่นampอย่างไรก็ตาม หากคุณมีอินเทอร์เฟซ DDR สามอินเทอร์เฟซ หนึ่งในนั้นจะต้องถูกแมปเป็นหน่วยความจำที่ต่างกัน ในกรณีนี้ ให้ตรวจสอบการทำงานของสแตก OpenCL ด้วยอินเทอร์เฟซ DDR แต่ละอันแยกจากกัน
OpenCL และโลโก้ OpenCL เป็นเครื่องหมายการค้าของ Apple Inc. ซึ่งใช้โดยได้รับอนุญาตจาก Khronos Group™ - Intel FPGA SDK สำหรับ OpenCL อิงตามข้อกำหนด Khronos ที่เผยแพร่ และผ่านกระบวนการทดสอบความสอดคล้องของ Khronos สามารถดูสถานะความสอดคล้องปัจจุบันได้ที่ www.khronos.org/conformance
- เช่นampอย่างไรก็ตาม หากคุณมีอินเทอร์เฟซ DDR สามอินเทอร์เฟซ หนึ่งในนั้นจะต้องถูกแมปเป็นหน่วยความจำที่ต่างกัน ในกรณีนี้ ให้ตรวจสอบการทำงานของสแตก OpenCL ด้วยอินเทอร์เฟซ DDR แต่ละอันแยกจากกัน
อินเทล คอร์ปอเรชั่น สงวนลิขสิทธิ์. Intel, โลโก้ Intel และเครื่องหมายอื่นๆ ของ Intel เป็นเครื่องหมายการค้าของ Intel Corporation หรือบริษัทในเครือ Intel รับประกันประสิทธิภาพของ FPGA และผลิตภัณฑ์เซมิคอนดักเตอร์ตามข้อกำหนดปัจจุบันตามการรับประกันมาตรฐานของ Intel แต่ขอสงวนสิทธิ์ในการเปลี่ยนแปลงผลิตภัณฑ์และบริการใดๆ ได้ตลอดเวลาโดยไม่ต้องแจ้งให้ทราบ Intel จะไม่รับผิดชอบหรือรับผิดใด ๆ ที่เกิดขึ้นจากแอปพลิเคชันหรือการใช้ข้อมูล ผลิตภัณฑ์ หรือบริการใด ๆ ที่อธิบายไว้ในที่นี้ ยกเว้นตามที่ตกลงไว้อย่างชัดแจ้งเป็นลายลักษณ์อักษรโดย Intel ขอแนะนำให้ลูกค้า Intel ขอรับข้อมูลจำเพาะของอุปกรณ์เวอร์ชันล่าสุดก่อนที่จะใช้ข้อมูลที่เผยแพร่และก่อนทำการสั่งซื้อผลิตภัณฑ์หรือบริการ *ชื่อและแบรนด์อื่น ๆ อาจเป็นทรัพย์สินของผู้อื่น
ลงทะเบียน ISO 9001: 2015
หรือหากคุณมีอินเทอร์เฟซ DDR สองตัวและอินเทอร์เฟซ Quad Data Rate (QDR) หนึ่งอินเทอร์เฟซ ให้ตรวจสอบการทำงานของสแต็ก OpenCL ของอินเทอร์เฟซ DDR ทั้งสองและอินเทอร์เฟซ QDR โดยแยกจากกัน
Intel ขอแนะนำให้คุณใช้ PCI Express® – (PCIe® -) หรือการออกแบบพิเศษเฉพาะของ EMIF เพื่อทดสอบอินเทอร์เฟซหน่วยความจำของคุณ หลังจากที่คุณตรวจสอบแล้วว่าอินเทอร์เฟซหน่วยความจำแต่ละรายการทำงานได้ และการออกแบบ OpenCL ของคุณใช้งานได้กับชุดย่อยของอินเทอร์เฟซหน่วยความจำ ให้ดำเนินการต่อ
เพื่อสร้างระบบหน่วยความจำต่างกันที่ทำงานได้อย่างสมบูรณ์
1.2. การแก้ไข board_spec.xml File
แก้ไข board_spec.xml file เพื่อระบุประเภทของระบบหน่วยความจำต่างกันที่พร้อมใช้งานสำหรับเคอร์เนล OpenCL
ในระหว่างการคอมไพล์เคอร์เนล Intel FPGA SDK สำหรับ OpenCL Offline Compiler จะกำหนดอาร์กิวเมนต์เคอร์เนลให้กับหน่วยความจำตามอาร์กิวเมนต์ตำแหน่งบัฟเฟอร์ที่คุณระบุ
1. เรียกดู board_spec.xml file ในไดเร็กทอรีฮาร์ดแวร์ของแพลตฟอร์มที่คุณกำหนดเอง
2. เปิด board_spec.xml file ในโปรแกรมแก้ไขข้อความและแก้ไข XML ตามนั้น
เช่นampหากระบบฮาร์ดแวร์ของคุณมีหน่วยความจำ DDR สองตัวเป็นหน่วยความจำสากลเริ่มต้นและช่อง QDR สองช่องที่คุณจำลองเป็นหน่วยความจำต่างกัน ให้แก้ไขส่วนหน่วยความจำของ board_spec.xml file ให้มีลักษณะดังต่อไปนี้:
1.3. การตั้งค่าตัวแบ่งหน่วยความจำหลายตัวใน Qsys
ปัจจุบัน OpenCL Memory Bank Divider ในการออกแบบ Qsys ไม่รองรับหน่วยความจำแบงค์จำนวนที่ไม่ใช่กำลัง 2 ซึ่งไม่ใช่ข้อจำกัดสำหรับการกำหนดค่าทั่วไป อย่างไรก็ตาม มีสถานการณ์ที่จำเป็นต้องใช้อินเทอร์เฟซหน่วยความจำจำนวนที่ไม่ใช่กำลัง 2 เพื่อรองรับอินเทอร์เฟซหน่วยความจำจำนวนไม่เต็มกำลัง 2 ให้ใช้ OpenCL Memory Bank Dividers หลายตัวเพื่อสร้างระบบหน่วยความจำต่างกันด้วยจำนวนแบตสำรองหน่วยความจำไม่เต็มกำลัง 2 คุณต้องสร้าง OpenCL Memory Bank Dividers หลายตัวเมื่อคุณมีระบบหน่วยความจำที่ต่างกันจริง พิจารณาระบบที่มีอินเทอร์เฟซหน่วยความจำ DDR หนึ่งอินเทอร์เฟซและอินเทอร์เฟซหน่วยความจำ QDR หนึ่งอินเทอร์เฟซ เนื่องจากทั้งสองธนาคารมีโทโพโลยีหน่วยความจำที่แตกต่างกัน คุณจึงไม่สามารถรวมเข้าด้วยกันภายใต้หน่วยความจำส่วนกลางเดียวได้
รูปที่ 1 บล็อกไดอะแกรมของระบบหน่วยความจำต่างกันสามธนาคาร
ระบบหน่วยความจำที่แตกต่างกันนี้ประกอบด้วยอินเทอร์เฟซหน่วยความจำ DDR สองอินเทอร์เฟซและอินเทอร์เฟซหน่วยความจำ QDR หนึ่งอินเทอร์เฟซหากคุณใช้เวอร์ชัน 16.0, 16.0.1 หรือ 16.0.2 ของซอฟต์แวร์ Intel Quartus® Prime และ Altera SDK สำหรับ OpenCL ตัวแบ่งธนาคารหน่วยความจำ OpenCL จะจัดการกับหน่วยความจำที่ขยายเกินขอบเขตที่อยู่อย่างไม่ถูกต้อง หากต้องการแก้ไขปัญหาที่ทราบนี้ ให้เพิ่มไปป์ไลน์บริดจ์ที่มีขนาดต่อเนื่องเป็น 1 และเชื่อมต่อ Avalon ®Memory-Mapped (Avalon-MM) หลักเข้ากับพอร์ตทาสของ OpenCL Memory Bank Divider
บันทึก:
ปัญหาที่ทราบนี้ได้รับการแก้ไขแล้วในซอฟต์แวร์ Intel Quartus Prime และ Intel FPGA SDK สำหรับ OpenCL เวอร์ชัน 16.1
รูปที่ 2 บล็อกไดอะแกรมของระบบหน่วยความจำต่างกันสามธนาคารพร้อมไปป์ไลน์บริดจ์ 1.4. การปรับเปลี่ยนโปรแกรม Boardtest และรหัสโฮสต์สำหรับโซลูชันหน่วยความจำที่แตกต่างกันของคุณ
ใช้เคอร์เนล boardtest.cl ที่มาพร้อมกับ Intel FPGA SDK สำหรับชุดเครื่องมือแพลตฟอร์มที่กำหนดเองของ OpenCL เพื่อทดสอบการทำงานและประสิทธิภาพของแพลตฟอร์มที่กำหนดเองของคุณ
โปรแกรมทดสอบบอร์ดคือเคอร์เนล OpenCL ที่ให้คุณทดสอบแบนด์วิดท์ระหว่างโฮสต์กับอุปกรณ์ แบนด์วิธหน่วยความจำ และฟังก์ชันการทำงานทั่วไปของแพลตฟอร์มที่คุณกำหนดเอง
- เรียกดูไปที่ /board/ custom_platform_toolkit/tests/boardtest ไดเร็กทอรี
- เปิด boardtest.cl file ในโปรแกรมแก้ไขข้อความและกำหนดตำแหน่งบัฟเฟอร์ให้กับอาร์กิวเมนต์หน่วยความจำทั่วโลกแต่ละรายการ
เช่นampเลอ:
__เคอร์เนลเป็นโมฆะ
mem_stream (__global__attribute__((buffer_location("DDR"))) uint *src, __global __attribute__((buffer_location("QDR"))) uint *dst, uint arg, uint arg2)
ในที่นี้ uint *src ถูกกำหนดให้กับหน่วยความจำ DDR และ uint *dst ถูกกำหนดให้กับหน่วยความจำ QDR board_spec.xml file ระบุคุณสมบัติของระบบหน่วยความจำทั้งสอง - หากต้องการใช้ประโยชน์จากโซลูชันหน่วยความจำที่แตกต่างกันในระบบ OpenCL ของคุณ ให้แก้ไขโค้ดโฮสต์ของคุณโดยเพิ่มแฟล็ก CL_MEM_HETEROGENEOUS_INTELFPGA ลงในการเรียก clCreateBuffer ของคุณ
เช่นampเลอ:
ddatain = clCreateBuffer (บริบท, CL_MEM_READ_WRITE | memflags
CL_MEM_HETEROGENEOUS_INTELFPGA, ขนาดของ (ไม่ได้ลงนาม) * vectorSize, NULL, &สถานะ);
Intel ขอแนะนำอย่างยิ่งให้คุณตั้งค่าตำแหน่งบัฟเฟอร์เป็นอาร์กิวเมนต์เคอร์เนลก่อนที่จะเขียนบัฟเฟอร์ เมื่อใช้หน่วยความจำโกลบอลเดี่ยว คุณสามารถเขียนบัฟเฟอร์ก่อนหรือหลังการกำหนดบัฟเฟอร์ให้กับอาร์กิวเมนต์เคอร์เนลได้ ในระบบหน่วยความจำต่างกัน โฮสต์จะตั้งค่าตำแหน่งบัฟเฟอร์ก่อนที่จะเขียนบัฟเฟอร์ กล่าวอีกนัยหนึ่ง โฮสต์จะเรียกใช้ฟังก์ชัน clSetKernelArgument ก่อนที่จะเรียกใช้ฟังก์ชัน clEnqueueWriteBuffer
ในรหัสโฮสต์ของคุณ ให้เรียกใช้การเรียก clCreateBuffer, clSetKernelArg และ clEnqueueWriteBuffer ตามลำดับต่อไปนี้:
ddatain = clCreateBuffer (บริบท, CL_MEM_READ_WRITE | memflags |
CL_MEM_HETEROGENEOUS_INTELFPGA, ขนาดของ (ไม่ได้ลงนาม) * vectorSize, NULL, &สถานะ);
… status = clSetKernelArg(kernel[k], 0, sizeof(cl_mem), (void*)&ddatain);
… สถานะ = clEnqueueWriteBuffer (คิว, ddatain, CL_FALSE, 0, ขนาดของ (ไม่ได้ลงนาม) * vectorSize, hdatain, 0, NULL, NULL);
ALTERAOCLSDKROOT/board/custom_platform_toolkit/tests/boardtest/host/memspeed.cpp file นำเสนอลำดับที่คล้ายกันของการเรียกใช้ฟังก์ชันเหล่านี้ - หลังจากที่คุณแก้ไข boardtest.cl แล้ว file และรหัสโฮสต์ รวบรวมรหัสโฮสต์และเคอร์เนลและตรวจสอบการทำงาน
เมื่อคอมไพล์โค้ดเคอร์เนลของคุณ คุณต้องปิดการใช้งานเบิร์สต์อินเทอร์ลีฟของระบบหน่วยความจำทั้งหมดโดยรวมฟังก์ชัน –no-interleaving ตัวเลือกในคำสั่ง aoc
ข้อมูลที่เกี่ยวข้อง
การปิดใช้งาน Burst-Interleaving ของหน่วยความจำส่วนกลาง (–no-interleaving -
1.5. การตรวจสอบการทำงานของหน่วยความจำที่แตกต่างกันของคุณ ระบบ
เพื่อให้แน่ใจว่าระบบหน่วยความจำต่างกันทำงานได้อย่างถูกต้อง ให้ยกเลิกการตั้งค่าแฟล็ก CL_CONTEXT_COMPILER_MODE_INTELFPGA ในโค้ดโฮสต์ของคุณ
ในระบบ OpenCL ที่มีหน่วยความจำที่เป็นเนื้อเดียวกัน คุณต้องเลือกที่จะตั้งค่าแฟล็ก CL_CONTEXT_COMPILER_MODE_INTELFPGA=3 ในโค้ดโฮสต์ของคุณเพื่อปิดการอ่านไฟล์ .aocx file และการเขียนโปรแกรมใหม่ของ FPGA การตั้งค่าแฟล็ก CL_CONTEXT_COMPILER_MODE_INTELFPGA=3 มีประโยชน์เมื่อสร้างบอร์ดของคุณเพื่อตรวจสอบการทำงานของแพลตฟอร์มที่กำหนดเองโดยไม่ต้องออกแบบแผนผังชั้นและระบุขอบเขตของ LogicLock™
ด้วยระบบหน่วยความจำที่ต่างกัน สภาพแวดล้อมรันไทม์จะต้องอ่านตำแหน่งบัฟเฟอร์ของแต่ละบัฟเฟอร์ตามที่อธิบายไว้ใน .aocx fileเพื่อตรวจสอบการทำงานของระบบหน่วยความจำ อย่างไรก็ตาม คุณอาจต้องการตรวจสอบฟังก์ชันการทำงานของแพลตฟอร์มแบบกำหนดเองของคุณโดยไม่ต้องใช้คุณลักษณะขั้นสุดท้ายของการออกแบบบอร์ด เช่น การออกแบบแผนผังชั้นและการระบุขอบเขตของ LogicLock
- ตรวจสอบว่าไม่ได้ตั้งค่าสถานะ CL_CONTEXT_COMPILER_MODE_INTELFPGA ในรหัสโฮสต์ของคุณ
- เรียกดูกระดาน/ ไดเร็กทอรี /source/host/mmd ของแพลตฟอร์มที่คุณกำหนดเอง
- เปิดอุปกรณ์แมปหน่วยความจำ acl_pcie_device.cpp (MMD) file ในโปรแกรมแก้ไขข้อความ
- แก้ไขฟังก์ชัน reprogram ใน acl_pcie_device.cpp file โดยการเพิ่มผลตอบแทน 0; บรรทัด ดังที่แสดงด้านล่าง:
int ACL_PCIE_DEVICE::reprogram (โมฆะ * data, size_t data_size)
{
กลับ 0;
//ถือว่าล้มเหลว
int reprogram_failed = 1;
// ถือว่าไม่มี rbf หรือแฮชใน fpga.bin
int rbf_or_hash_not_provided = 1;
// ถือว่าแฮชการแก้ไขฐานและการนำเข้าไม่ตรงกัน
int hash_mismatch = 1;
…
} - คอมไพล์ acl_pcie_device.cpp อีกครั้ง file.
- ตรวจสอบว่าค่าสถานะ CL_CONTEXT_COMPILER_MODE_INTELFPGA ยังคงไม่ได้ตั้งค่า
ความสนใจ: หลังจากที่คุณเพิ่ม return 0; ไปยังฟังก์ชันโปรแกรมใหม่และคอมไพล์ MMD ใหม่ fileสภาพแวดล้อมรันไทม์จะอ่าน .aocx file และกำหนดตำแหน่งบัฟเฟอร์แต่จะไม่ตั้งโปรแกรม FPGA ใหม่ คุณต้องจับคู่อิมเมจ FPGA กับ .aocx ด้วยตนเอง file- หากต้องการย้อนกลับพฤติกรรมนี้ ให้ลบ return 0; จากฟังก์ชัน reprogram และคอมไพล์ MMD ใหม่ file.
1.6. ประวัติการแก้ไขเอกสาร
วันที่ | เวอร์ชัน | การเปลี่ยนแปลง |
17 ธ.ค. | 2017.12.01 | • แบรน CL_MEM_HETEROGENEOUS_ALTERA เป็น CL_MEM_HETEROGENEOUS_INTELFPGA |
16 ธ.ค. | 2016.12.13 | • เปลี่ยนโฉม CL_CONTEXT_COMPILER_MODE_ALTERA เป็น CL_CONTEXT_COMPILER_MODE_INTELFPGA |
การสร้างระบบหน่วยความจำที่แตกต่างกันใน Intel® FPGA SDK สำหรับ OpenCL
แพลตฟอร์มที่กำหนดเอง
ส่งคำติชม
เวอร์ชั่นออนไลน์
ส่งคำติชม
รหัส : 683654
เวอร์ชัน : 2016.12.13
เอกสาร / แหล่งข้อมูล
![]() |
Intel การสร้างระบบหน่วยความจำที่แตกต่างกันใน FPGA SDK สำหรับแพลตฟอร์ม OpenCL แบบกำหนดเอง [พีดีเอฟ] คำแนะนำ การสร้างระบบหน่วยความจำที่แตกต่างกันใน FPGA SDK สำหรับแพลตฟอร์มที่กำหนดเองของ OpenCL, การสร้างระบบหน่วยความจำที่แตกต่างกัน, FPGA SDK สำหรับแพลตฟอร์มที่กำหนดเองของ OpenCL |