OpenCL 맞춤형 플랫폼용 FPGA SDK에서 이기종 메모리 시스템 생성
지침
OpenCL 사용자 정의 플랫폼을 위한 Intel® FPGA SDK에서 이기종 메모리 시스템 생성
사용자 정의 플랫폼에서 이기종 메모리를 구현하면 더 많은 외부 메모리 인터페이스(EMIF) 대역폭과 더 크고 빠른 메모리 액세스가 가능합니다. 최적화된 이기종 메모리 액세스와 결합하면
OpenCL ™(1) 커널은 OpenCL 시스템의 성능을 크게 향상시킬 수 있습니다.
이 애플리케이션 노트는 Intel® FPGA SDK for OpenCL(2)과 함께 사용할 사용자 정의 플랫폼에서 이기종 메모리 시스템을 만드는 방법에 대한 지침을 제공합니다. Intel은 사용자가 이기종 메모리 시스템을 포함하는 사용자 정의 플랫폼을 개발하는 숙련된 FPGA 설계자라고 가정합니다.
이기종 메모리 시스템을 만들기 전에 아래에 명시된 OpenCL용 Intel FPGA SDK 문서를 숙지하세요.
관련 정보
- OpenCL 프로그래밍 가이드를 위한 Intel FPGA SDK
- OpenCL을 위한 Intel FPGA SDK 모범 사례 가이드
- OpenCL Arria 10 GX FPGA 개발 키트 참조 플랫폼 포팅 가이드를 위한 Intel FPGA SDK
1.1. FPGA 보드 및 EMIF 인터페이스의 기능 확인
각 메모리 인터페이스를 독립적으로 검증한 다음 글로벌 메모리를 사용하여 사용자 지정 플랫폼을 인스턴스화합니다.
- 각 인터페이스의 속도와 안정성을 테스트할 수 있는 하드웨어 설계를 사용하여 각 메모리 인터페이스를 확인합니다.
- 글로벌 메모리를 사용하여 사용자 지정 플랫폼을 인스턴스화합니다.
- 예를 들어ample, DDR 인터페이스가 3개 있는 경우, 그 중 하나는 이기종 메모리로 매핑되어야 합니다. 이 경우, 각 DDR 인터페이스가 독립적으로 OpenCL 스택의 기능을 확인합니다.
OpenCL 및 OpenCL 로고는 Apple Inc.의 상표이며 Khronos Group™의 허가를 받아 사용됩니다. - OpenCL용 인텔 FPGA SDK는 게시된 Khronos 사양을 기반으로 하며 Khronos 적합성 테스트 프로세스를 통과했습니다. 현재 적합성 상태는 다음에서 확인할 수 있습니다. www.khronos.org/conformance.
- 예를 들어ample, DDR 인터페이스가 3개 있는 경우, 그 중 하나는 이기종 메모리로 매핑되어야 합니다. 이 경우, 각 DDR 인터페이스가 독립적으로 OpenCL 스택의 기능을 확인합니다.
인텔사. 판권 소유. 인텔, 인텔 로고 및 기타 인텔 마크는 인텔사 또는 그 자회사의 상표입니다. 인텔은 인텔의 표준 보증에 따라 FPGA 및 반도체 제품의 성능을 최신 사양으로 보증하지만 사전 통지 없이 언제든지 제품 및 서비스를 변경할 수 있는 권리를 보유합니다. 인텔은 인텔이 서면으로 명시적으로 동의한 경우를 제외하고 여기에 설명된 정보, 제품 또는 서비스의 적용 또는 사용으로 인해 발생하는 어떠한 책임도 지지 않습니다. 인텔 고객은 게시된 정보에 의존하고 제품이나 서비스를 주문하기 전에 최신 버전의 장치 사양을 얻는 것이 좋습니다. *다른 이름과 브랜드는 다른 사람의 자산일 수 있습니다.
ISO 9001 : 2015 등록
또는 DDR 인터페이스가 두 개와 QDR(Quad Data Rate) 인터페이스가 하나 있는 경우 두 DDR 인터페이스와 QDR 인터페이스의 OpenCL 스택 기능을 독립적으로 확인하세요.
인텔은 메모리 인터페이스를 테스트하기 위해 PCI Express® – (PCIe® -) 또는 EMIF 전용 설계를 사용할 것을 권장합니다. 각 메모리 인터페이스가 작동하고 OpenCL 설계가 메모리 인터페이스의 하위 집합과 작동하는지 확인한 후 다음을 진행합니다.
완벽하게 기능하는 이기종 메모리 시스템을 만드는 것입니다.
1.2. board_spec.xml 수정 File
board_spec.xml 수정 file OpenCL 커널에서 사용할 수 있는 이기종 메모리 시스템의 유형을 지정합니다.
커널 컴파일 중에 OpenCL 오프라인 컴파일러용 Intel FPGA SDK는 사용자가 지정한 버퍼 위치 인수에 따라 메모리에 커널 인수를 할당합니다.
1. board_spec.xml로 이동합니다. file 사용자 정의 플랫폼의 하드웨어 디렉토리에서.
2. board_spec.xml을 엽니다. file 텍스트 편집기에서 XML을 적절히 수정합니다.
예를 들어amp하드웨어 시스템에 기본 글로벌 메모리로 두 개의 DDR 메모리가 있고 이기종 메모리로 모델링하는 두 개의 QDR 뱅크가 있는 경우 board_spec.xml의 메모리 섹션을 수정합니다. file 다음과 유사합니다:
1.3. Qsys에서 다중 메모리 디바이더 설정
현재 Qsys 설계의 OpenCL 메모리 뱅크 디바이더는 2의 거듭제곱이 아닌 개수의 메모리 뱅크를 지원하지 않습니다. 이는 일반적인 구성에 대한 제한 사항이 아닙니다. 그러나 2의 거듭제곱이 아닌 개수의 메모리 인터페이스가 필요한 시나리오가 있습니다. 2의 거듭제곱이 아닌 개수의 메모리 인터페이스를 수용하려면 여러 OpenCL 메모리 뱅크 디바이더를 사용하여 2의 거듭제곱이 아닌 개수의 메모리 뱅크가 있는 이기종 메모리 시스템을 만듭니다. 진정한 이기종 메모리 시스템이 있는 경우 여러 OpenCL 메모리 뱅크 디바이더를 만들어야 합니다. DDR 메모리 인터페이스 하나와 QDR 메모리 인터페이스 하나가 있는 시스템을 고려합니다. 두 뱅크의 메모리 토폴로지가 다르기 때문에 단일 글로벌 메모리로 결합할 수 없습니다.
그림 1. XNUMX뱅크 이기종 메모리 시스템의 블록 다이어그램
이 이기종 메모리 시스템에는 두 개의 DDR 메모리 인터페이스와 하나의 QDR 메모리 인터페이스가 포함되어 있습니다.Intel Quartus® Prime 소프트웨어의 버전 16.0, 16.0.1 또는 16.0.2와 Altera SDK for OpenCL을 사용하는 경우 OpenCL Memory Bank Divider가 주소 경계를 넘나드는 메모리 버스트를 잘못 처리합니다. 이 알려진 문제를 해결하려면 버스트 크기가 1인 파이프라인 브리지를 추가하고 Avalon ®Memory-Mapped(Avalon-MM) 마스터를 OpenCL Memory Bank Divider의 슬레이브 포트에 연결합니다.
메모:
이 알려진 문제는 Intel Quartus Prime 소프트웨어와 Intel FPGA SDK for OpenCL 버전 16.1에서 수정되었습니다.
그림 2. 파이프라인 브리지를 갖춘 XNUMX뱅크 이기종 메모리 시스템의 블록 다이어그램 1.4. 이기종 메모리 솔루션을 위한 Boardtest 프로그램 및 호스트 코드 수정
OpenCL 사용자 정의 플랫폼 툴킷용 Intel FPGA SDK와 함께 제공되는 boardtest.cl 커널을 사용하여 사용자 정의 플랫폼의 기능과 성능을 테스트합니다.
보드테스트 프로그램은 사용자 정의 플랫폼의 호스트-장치 대역폭, 메모리 대역폭 및 일반적인 기능을 테스트할 수 있는 OpenCL 커널입니다.
- 탐색하다 /board/ custom_platform_toolkit/tests/boardtest 디렉토리.
- boardtest.cl을 엽니다 file 텍스트 편집기에서 각 전역 메모리 인수에 버퍼 위치를 지정합니다.
예를 들어amp르 :
__커널 무효
mem_stream (__global__attribute__((버퍼 위치(“DDR”))) uint *src, __global __attribute__((버퍼 위치(“QDR”))) uint *dst, uint 인수, uint 인수2)
여기서 uint *src는 DDR 메모리에 할당되고, uint *dst는 QDR 메모리에 할당됩니다. board_spec.xml file 두 메모리 시스템의 특성을 명시합니다. - OpenCL 시스템에서 이기종 메모리 솔루션을 활용하려면 clCreateBuffer 호출에 CL_MEM_HETEROGENEOUS_INTELFPGA 플래그를 추가하여 호스트 코드를 수정합니다.
예를 들어amp르 :
ddatain = clCreateBuffer(컨텍스트, CL_MEM_READ_WRITE | memflags
CL_MEM_HETEROGENEOUS_INTELFPGA, sizeof(unsigned) * vectorSize, NULL, &status);
Intel은 버퍼를 쓰기 전에 버퍼 위치를 커널 인수로 설정할 것을 강력히 권장합니다. 단일 글로벌 메모리를 사용하는 경우, 버퍼를 커널 인수에 할당하기 전이나 후에 쓸 수 있습니다. 이기종 메모리 시스템에서 호스트는 버퍼를 쓰기 전에 버퍼 위치를 설정합니다. 즉, 호스트는 clEnqueueWriteBuffer 함수를 호출하기 전에 clSetKernelArgument 함수를 호출합니다.
호스트 코드에서 다음 순서로 clCreateBuffer, clSetKernelArg 및 clEnqueueWriteBuffer 호출을 호출합니다.
ddatain = clCreateBuffer(컨텍스트, CL_MEM_READ_WRITE | memflags |
CL_MEM_HETEROGENEOUS_INTELFPGA, sizeof(unsigned) * vectorSize, NULL, &status);
… 상태 = clSetKernelArg(커널[k], 0, cl_mem의 크기), (void*)&ddatain);
... 상태 = clEnqueueWriteBuffer(큐, ddatain, CL_FALSE, 0, sizeof(unsigned) * vectorSize, hdatain, 0, NULL, NULL);
ALTERAOCLSDKROOT/board/custom_platform_toolkit/tests/boardtest/host/memspeed.cpp file 이러한 함수 호출의 순서는 유사합니다. - boardtest.cl을 수정한 후 file 호스트 코드를 컴파일하고 호스트 및 커널 코드를 컴파일하여 기능을 검증합니다.
커널 코드를 컴파일할 때 –no-interleaving을 포함하여 모든 메모리 시스템의 버스트 인터리빙을 비활성화해야 합니다. aoc 명령의 옵션.
관련 정보
글로벌 메모리의 버스트 인터리빙 비활성화(–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 텍스트 편집기에서.
- acl_pcie_device.cpp에서 재프로그램 기능을 수정하세요 file 아래와 같이 return 0; 줄을 추가합니다.
int ACL_PCIE_DEVICE::reprogram(void *data, size_t data_size)
{
0을 반환합니다.
// 실패를 가정합니다
int 재프로그램 실패 = 1;
// fpga.bin에 rbf나 hash가 없다고 가정합니다.
int rbf_or_hash_not_provided = 1;
// 기본 및 가져오기 개정 해시가 일치하지 않는다고 가정합니다.
int 해시_불일치 = 1;
…
} - acl_pcie_device.cpp를 다시 컴파일하세요 file.
- CL_CONTEXT_COMPILER_MODE_INTELFPGA 플래그가 설정되지 않은 상태인지 확인합니다.
주목: reprogram 함수에 return 0;을 추가하고 MMD를 다시 컴파일한 후 file, 런타임 환경은 .aocx를 읽습니다. file 버퍼 위치를 지정하지만 FPGA를 재프로그래밍하지는 않습니다. FPGA 이미지를 .aocx와 수동으로 일치시켜야 합니다. file. 이 동작을 되돌리려면 reprogram 함수에서 return 0;을 제거하고 MMD를 다시 컴파일하십시오. file.
1.6. 문서 개정 이력
날짜 | 버전 | 변화 |
17월-XNUMX | 2017.12.01 | • CL_MEM_HETEROGENEOUS_ALTERA를 CL_MEM_HETEROGENEOUS_INTELFPGA로 리브랜딩했습니다. |
16월-XNUMX | 2016.12.13 | • CL_CONTEXT_COMPILER_MODE_ALTERA를 CL_CONTEXT_COMPILER_MODE_INTELFPGA로 리브랜딩했습니다. |
Intel® FPGA SDK for OpenCL에서 이기종 메모리 시스템 생성
맞춤형 플랫폼
피드백 보내기
온라인 버전
피드백 보내기
아이디: 683654
버전: 2016.12.13
문서 / 리소스
![]() |
intel OpenCL 사용자 정의 플랫폼을 위한 FPGA SDK에서 이기종 메모리 시스템 생성 [PDF 파일] 지침 OpenCL 사용자 정의 플랫폼을 위한 FPGA SDK에서 이기종 메모리 시스템 생성, 이기종 메모리 시스템 생성, OpenCL 사용자 정의 플랫폼을 위한 FPGA SDK |