트레이딩에서 OpenCL - 페이지 3

 

AMD Developer Central: OpenCL 프로그래밍 웨비나 시리즈.2. OpenCL 소개



2- OpenCL 소개

이 비디오는 CPU 및 GPU를 사용하여 계산을 가속화할 수 있는 병렬 컴퓨팅용 플랫폼인 OpenCL에 대한 자세한 소개를 제공합니다. OpenCL로 작성된 프로그램은 다양한 장치 및 아키텍처에서 실행될 수 있으므로 다양한 플랫폼에서 코드를 이식할 수 있습니다. 이 비디오는 데이터 병렬화 및 작업 병렬화를 포함하여 OpenCL의 다양한 실행 모델에 대해 설명하고 메모리 개체, 명령 대기열 및 커널 개체와 같이 OpenCL에서 사용되는 다양한 개체 및 명령도 다룹니다. 비디오는 또한 명시적 메모리 관리의 필요성과 병렬 프로그램의 상당한 성능 향상 가능성과 같은 OpenCL 사용의 장점과 한계에 대해 자세히 설명합니다.

  • 00:00:00 이 섹션에서 연사는 OpenCL과 CPU 및 GPU를 사용하여 병렬 계산을 가속화하여 상당한 속도 향상을 가져오는 기능을 소개합니다. 100X 또는 1000X와 같은 숫자가 때때로 인용되지만 현실적으로 최적화된 프로그램의 경우 약 10-20X의 속도 향상이 예상됩니다. OpenCL은 다양한 장치 및 아키텍처에서 이식 가능한 코드를 작성할 수 있습니다. 따라서 AMD GPU용으로 작성된 프로그램은 일반적으로 NVIDIA GPU에서도 실행할 수 있습니다. AMD 구현으로 일부 다른 경쟁사의 구현과 달리 OpenCL의 CPU 및 GPU 구현이 모두 제공됩니다. 이 섹션은 이기종 컴퓨팅에 대한 개요와 OpenCL이 여기에 어떻게 적용되는지에 대한 개요로 끝납니다.

  • 00:05:00 이 섹션에서 연사는 응용 프로그램에 올바른 특성이 있는 경우 성능 면에서 보상이 될 수 있는 저수준의 장황한 플랫폼인 OpenCL에 대해 소개합니다. OpenCL은 호스트 API, 연결된 장치 모델 및 메모리 모델로 구성된 플랫폼 기반 모델입니다. 장치는 컴퓨팅 단위의 집합으로 간주되며 각 컴퓨팅 단위는 SIMD에서 실행되는 처리 요소로 나뉩니다. 실행 모델은 여러 데이터에서 병렬로 실행할 수 있는 실행 코드 단위인 커널 개념을 기반으로 합니다. 또한 OpenCL은 읽기 및 쓰기 작업의 비동기 실행과 커널 실행을 허용하는 일련의 대기열을 제공합니다.

  • 00:10:00 이 섹션에서 발표자는 OpenCL의 두 가지 주요 실행 모델인 데이터 병렬 처리와 작업 병렬 처리에 대해 설명합니다. 데이터 병렬 모델은 GPU에서 실행하기에 가장 효율적이며 각 개별 요소를 잠재적으로 병렬로 실행할 수 있는 작업 항목이라고 하는 N 차원 계산 도메인을 포함합니다. 작업 항목 실행은 사용 가능한 컴퓨팅 단위 중 하나에서 실행되는 작업 그룹이라는 로컬 차원으로 그룹화할 수 있습니다. 연사는 OpenCL의 데이터 병렬 세계에서 루프가 어떻게 내포되어 있는지, 전역 식별자 가져오기 루틴을 사용하여 a와 b를 인덱싱하는 방법도 설명합니다.

  • 00:15:00 이 섹션에서 발표자는 캐시와 유사하고 사용자가 관리하는 로컬 메모리에 대해 논의하며, 지연 시간이 짧고 글로벌 메모리보다 빠릅니다. 동기화 기능을 사용하면 작업 항목이 메모리 위치에 쓰고 완료될 때까지 기다린 다음 다른 작업 항목이 해당 메모리 위치를 읽고 이전 작업 항목에서 쓴 값을 가져올 수 있습니다. 동기화는 작업 그룹 내에서만 수행할 수 있습니다. OpenCL은 또한 단일 작업 항목에 의해 실행되는 작업 병렬 처리를 지원하고 호스트 API의 OpenCL 대기열 모델 및 동기화 기능을 사용하여 기본적으로 컴파일된 코드를 허용합니다. OpenCL은 특정 GPU의 메모리 계층 구조가 명시적으로 노출된다는 점에서 C와 다르며 프로그래머는 배리어 작업 및 동기화를 사용하여 데이터의 순서 및 일관성을 유도할 수 있습니다.

  • 00:20:00 이 섹션에서 발표자는 강력한 성능 기능과 같은 OpenCL의 장점에 대해 논의합니다. 그러나 그들은 OpenCL의 메모리 관리가 복잡할 수 있고 알고리즘에 대한 신중한 고려가 필요한 명시적인 작업이 필요하다고 지적합니다. 컴파일 모델은 OpenGL을 기반으로 하며 온라인 컴파일을 위해 OpenCL 소스 코드의 스트림 또는 문자열을 전달할 수 있는 온라인 컴파일 모델이 있습니다. OpenCL은 컨텍스트, 장치 모음 및 메모리 개체를 중심으로 구축되며 대기열은 컨텍스트와 연결된 특정 장치에 작업을 제출하는 데 사용됩니다. 메모리 개체는 배열로 생각할 수 있는 메모리의 1차원 블록인 버퍼입니다.

  • 00:25:00 이 섹션에서 발표자는 메모리 개체, 이미지, 프로그램 및 커널을 포함하여 다양한 OpenCL 개체를 설명합니다. 메모리 객체는 버퍼 또는 이미지 유형일 수 있으며 이미지에는 액세스를 최적화하기 위한 하드웨어 구현이 있습니다. 실행을 위해 커널을 정의하는 프로그램을 빌드하고 추출할 수 있으며 커널 인수 값은 커널 개체를 사용하여 설정할 수 있습니다. 명령 대기열은 실행을 위해 커널 및 기타 명령을 대기열에 넣는 데 사용됩니다. 또한 OpenCL 이벤트는 명령 간의 종속성을 구축하고 명령 상태를 쿼리하는 데 유용합니다. 발표자는 장치 및 해당 ID를 쿼리하는 방법에 대한 예도 제공합니다.

  • 00:30:00 이 섹션에서 발표자는 OpenCL이 오류 코드와 개체를 반환하는 방법을 설명합니다. 함수가 CL 개체를 반환하는 경우 해당 개체를 결과로 반환합니다. 그러나 CL 개체를 반환하지 않는 경우 오류 코드를 결과로 반환합니다. 컨텍스트에 대해 설명하고 컨텍스트 수준에서 메모리가 할당되는 방식, 즉 버퍼와 이미지가 장치 간에 공유됨을 의미합니다. 또한 발표자는 CL get X 정보 기능, 특히 개발자가 장치 기능을 쿼리하여 알고리즘에 가장 적합한 장치를 결정할 수 있는 CL 장치 정보 가져오기 기능에 대해 언급합니다. 마지막으로 연사는 버퍼와 이미지, 커널이 이미지 액세스에 대한 제한과 함께 이들에 액세스하는 방법에 대해 논의합니다.

  • 00:35:00 이 섹션에서 발표자는 버퍼에 액세스하는 방법과 이미지 사용의 이점을 설명하는 방법을 포함하여 OpenCL에서 버퍼와 이미지를 할당하는 방법에 대해 설명합니다. 발표자는 명시적 명령을 사용하여 메모리 개체 데이터에 액세스하는 방법과 명령을 대기열에 넣는 방법도 설명합니다. 또한 비디오는 영역을 매핑하고 버퍼 간에 데이터를 전송하는 방법과 DMA 장치 사용의 장단점을 설명합니다. 이 섹션은 프로그램 및 커널 객체에 대해 논의하고 인수 값을 설정하는 것으로 결론을 내립니다.

  • 00:40:00 이 섹션에서 발표자는 OpenCL의 디스패치 및 종속성에 대해 설명합니다. 도메인 또는 실행 그리드를 기반으로 디스패치가 실행되는 방법과 서로 추월하지 않도록 종속성을 설정하는 방법을 설명합니다. 발표자는 또한 대기자 명단의 이벤트 수와 명령과 관련된 이벤트를 고려한 NQ 명령에 대한 인수를 설명합니다. 마지막으로 발표자는 C를 기반으로 하며 벡터 유형 및 동기화 프리미티브와 같은 특정 제한 및 추가가 있는 OpenCL C 언어에 대한 개요를 제공합니다. 이 언어는 작업 항목 및 작업 그룹뿐만 아니라 주소 공간 한정자 및 내장 함수를 허용합니다.

  • 00:45:00 이 섹션에서 발표자는 OpenCL과 커널 프로그래밍에 사용할 수 있는 다양한 주소 공간, 벡터 유형 및 스칼라 유형과 같은 기능에 대한 간략한 개요를 제공합니다. 또한 OpenCL API를 사용하여 메모리 개체를 생성하고 프로그램을 빌드 및 실행하는 방법에 대해서도 설명합니다. 그런 다음 발표자는 OpenCL의 데이터 병렬 처리가 컴파일러의 루프 언롤링과 어떻게 다른지에 대한 질문에 답합니다.

  • 00:50:00 이 섹션에서 발표자는 데이터 병렬 실행의 개념과 이를 효율적으로 수행하는 구성 요소의 어려움을 설명합니다. 그는 또한 OpenCL이나 다른 모델을 위한 프로그램을 명시적으로 병렬화해야 할 필요성을 강조합니다. inq_marker는 다루어지는 또 다른 주제이며 순서가 어긋난 큐에서 유용한 방법입니다. 화자는 상수 메모리가 값이 일정하다는 것을 의미하며 읽기 전용인 매우 빠른 상수 메모리에 로드하기 위해 특수 GPU에서 사용된다는 것을 반복합니다. 그는 OpenCL 및 병렬 프로그래밍에 대한 자세한 내용은 MD 웹 사이트의 OpenCL Zone을 확인하라고 제안합니다. 마지막으로 그는 get_global_ID(0)가 커널의 모든 호출에 대해 동일한 값을 반환하는 방법에 대해 이야기합니다.

  • 00:55:00 이 섹션에서 발표자는 두 개의 서로 다른 응용 프로그램이 동일한 컴퓨터에서 실행되고 OpenCL을 사용하려고 할 때 오늘날 모든 구현이 하드웨어를 공유하고 OS가 응용 프로그램을 다중화할 것이라고 설명합니다. 그들은 id 하드웨어에 대한 정보를 쿼리할 수 있는 Visual Studio 플러그인 또는 Linux 명령줄 버전과 같은 OpenCL용 시각적 프로파일러를 사용할 것을 권장합니다. 데이터를 이미지 개체나 버퍼에 로드하는 오버헤드는 장치에 따라 달라지며 PCIe 버스를 통해 데이터를 전송하면 대기 시간이 더 길어집니다. 마지막으로 발표자는 새로운 AMD 68000 GPU 시리즈와 이를 위한 최고의 프로그래밍 방식이 이들이 기반으로 하는 Evergreen 아키텍처와 유사하다고 언급했습니다.
 

AMD Developer Central: OpenCL 프로그래밍 웨비나 시리즈. 3. GPU 아키텍처



3 - GPU 아키텍처

이 비디오는 GPU 아키텍처의 개요를 제공하며 그래픽 프로세서로서 GPU의 기원과 주요 용도에 주목합니다. GPU는 대기 시간이 짧은 파이프라인을 사용하여 스칼라 처리용으로 설계된 CPU와 달리 병렬 처리 수준이 높은 픽셀을 처리하도록 설계되었습니다. GPU의 아키텍처는 범용 계산에는 적합하지 않을 수 있는 그래픽 관련 작업에 최적화되어 있습니다. 발표자는 GPU가 단일 스레드의 실행 대기 시간을 최소화하는 대신 스레드 집합의 처리량을 최대화하는 방법을 설명합니다. 로컬 데이터 공유, 파면 및 작업 그룹을 포함하여 GPU 엔진 블록의 아키텍처에 대해서도 설명합니다. 이 비디오는 단일 패킷에서 종속 작업을 실행하고 글로벌 베타 공유로 종속 카운터를 지원하는 것을 포함하여 컴파일러가 수행할 수 있는 패킹의 양을 늘리는 데 도움이 되는 다양한 GPU 아키텍처 기능을 탐색합니다. GPU 및 CPU 코어 설계가 유사할 수 있지만 유사한 설계를 갖기 위해서는 워크로드가 수렴되어야 합니다.

GPU 아키텍처에 대한 이 비디오에서 연사는 배리어의 개념과 그 기능에 대해 자세히 설명합니다. 작업 그룹이 GPU에 여러 웨이브프론트를 포함하는 경우 배리어를 사용하여 이러한 웨이브프론트를 동기화합니다. 그러나 하나의 그룹에 작업 웨이브프론트가 하나만 존재하는 경우에는 장벽이 무의미해지고 비작업으로 축소됩니다.

  • 00:00:00 이 섹션에서 발표자는 저수준 아키텍처 또는 최적화를 설명하는 기존 접근 방식과 다른 관점에서 GPU 아키텍처에 대한 개요를 제공하는 웨비나의 목적을 소개합니다. 발표자들은 GPU 아키텍처의 기원과 그래픽 프로세서로서의 주요 사용 사례를 논의함으로써 GPU 아키텍처를 맥락에 맞추는 것을 목표로 합니다. 지연 시간이 짧은 파이프라인을 사용하여 스칼라 처리용으로 설계된 CPU와 달리 높은 수준의 병렬 처리로 픽셀을 처리하기 위해 GPU가 어떻게 설계되었는지 설명합니다. 발표자는 또한 GPU 아키텍처가 그래픽 관련 작업을 가속화하도록 설계된 최적화된 하드웨어 블록으로 인해 범용 컴퓨팅에 적합하지 않을 수 있는 방법에 대해서도 다룹니다.

  • 00:05:00 이 섹션에서는 독립적이고 GLSL 또는 HLSL로 작성된 단일 픽셀과 관련된 조각 프로그램을 실행하는 방법과 이 프로그래밍 패턴이 의존성 분석이나 픽셀 간 통신 없이 효율적인 병렬 처리를 허용하는 방법에 대해 알아봅니다. 하드웨어는 웨이브프론트로 알려진 셰이더 코드를 한 번에 여러 픽셀에서 실행하도록 설계되었지만 블록 코드 및 분기 문제가 있습니다. 이 문제는 모든 분기가 동일한 방식으로 진행되어 문제가 발생하지만 하드웨어는 모든 픽셀이 동일한 명령을 실행하도록 마스크를 생성합니다.

  • 00:10:00 이 섹션에서 연사는 Cindy 실행에 간단한 명령과 벡터 명령 사용이 필요한 방법에 대해 설명합니다. 벡터 명령어는 하드웨어나 컴파일러에서 생성할 수 있지만 다양한 작업의 수동 패키징, 분기 마스킹 및 신중한 수동 코딩의 필요성으로 인해 개발이 까다롭고 어려울 수 있습니다. 반면에 벡터 명령을 사용하여 Cindy 실행을 프로그래밍하면 개발자가 레인이 독립적으로 분기한다고 생각하게 될 위험이 있습니다. 이는 사실이 아닙니다. 그럼에도 불구하고 프로그래머는 여전히 생각하기 쉽고 현재 AMD GPU의 경우 마스킹은 하드웨어에 의해 제어됩니다. 이는 특히 더 넓은 Waveland에서 분기 분기와 함께 성능에 영향을 미칠 수 있으므로 토크의 목적인 계산에 대해 고려하는 것이 중요합니다.

  • 00:15:00 이 섹션에서 발표자는 처리량 컴퓨팅을 기반으로 하는 GPU 아키텍처의 가시적인 측면에 대해 논의합니다. 완료되면 동일한 명령을 사용하여 다음 벡터의 정지 시간을 처리할 수 있으므로 명령 디코드가 더 효율적이 됩니다. 발표자는 ALU 활용을 줄일 수 있는 벡터 폭을 늘리는 대신 여러 개의 웨이브프론트가 실행 중인 다른 스레드의 명령을 잠입할 수 있으므로 텍스처 장치가 메모리 데이터를 반환하기를 기다리는 동안 단순히 중단되지 않을 가능성이 있다고 설명합니다. 그러나 단일 웨이브프론트는 아키텍처 작동 방식 때문에 이러한 방식으로 실행하는 데 더 오래 걸립니다.

  • 00:20:00 이 섹션에서 비디오는 GPU가 단일 스레드의 실행 대기 시간을 최소화하는 대신 스레드 집합의 처리량을 최대화하는 방법을 설명합니다. 즉, GPU는 첫 번째 스레드가 실행을 완료할 때까지 기다렸다가 다음 웨이브프론트에 공급함으로써 스레드 활용도를 높이려고 시도하는 한편, 첫 번째 픽셀 집합의 결과는 재사용되어 파이프라인을 가능한 한 전체 점유에 가깝게 유지합니다. . GPU는 실행 중인 각 스레드에 대한 벡터의 전체 너비를 커버하기 위해 큰 레지스터 풀을 유지하며 장치의 공간을 차지하며 상태 수와 벡터의 너비에 따라 크기가 조정됩니다. GPU는 대기 시간을 처리하도록 설계되었으므로 대기 시간을 최소화하는 대신 GPU는 사용 가능한 메모리 대역폭을 최대화하여 작업 항목 간의 데이터 재사용을 위해 텍스처 캐시와 로컬 메모리를 사용하여 모든 병렬 처리를 충족할 수 있습니다.

  • 00:25:00 이 섹션에서 발표자는 캐시 및 프로그램 제어 공유 메모리 영역이 주 메모리 인터페이스에서 데이터를 한 번만 복사한 다음 다양한 경로의 여러 작업 항목에서 재사용할 수 있도록 하여 데이터 전송 감소를 달성하는 방법에 대해 설명합니다. 쿼드에서 2D 액세스를 캡처하기 위해 텍스처 캐시가 데이터에 2D 구조를 자동으로 효율적으로 적용하도록 어떻게 설계되었는지 설명합니다. 로컬 데이터 영역은 훨씬 더 많은 제어 기능을 제공하지만 이 메모리를 효율적으로 사용하고 데이터를 공유하여 전역 메모리 요구 사항을 줄이기 위해 부하를 효율적으로 구성하는 것은 개발자의 책임입니다. 또한 이 섹션에서는 파이프라인 대기 시간을 처리하기 위해 4개, 8개 또는 16개의 스레드를 인터리빙하는 여러 프로그램 상태가 있는 유선 Cindy 코어 모음으로 GPU를 볼 수 있는 방법을 살펴봅니다. 코어 수와 ALU 밀도 사이의 트레이드 오프에 대해 논의하며 워크로드에 따라 활용도를 높이는 이점이 있습니다.

  • 00:30:00 이 섹션에서 발표자는 Andy Phenom 2 X6 6 및 Intel i7과 같은 예를 사용하여 CPU와 GPU 코어 설계 간의 유사점과 차이점에 대해 논의합니다. Pentium 4 및 ultraSPARC T2에서 채택한 접근 방식에는 명령 수준 병렬성을 높이기 위해 여러 상태 세트가 있는 더 큰 코어 크기가 포함되었지만 GPU는 높은 수준의 데이터 밸런싱을 통해 스펙트럼의 극단에 있습니다. AMD Radeon HD 5870의 기술적 세부 사항도 논의되어 높은 대역폭과 각 웨이브프론트에서 사용되는 레지스터 수에 따라 사용 가능한 동시 파형 수를 지적합니다. 연사는 CPU와 GPU 9 사이의 설계 공간에 유사점이 있을 수 있지만 유사한 설계를 갖기 위해서는 워크로드가 수렴되어야 한다고 결론을 내립니다.

  • 00:35:00 이 섹션에서는 로컬 데이터 공유와 파면 및 분할된 작업 그룹을 포함하여 GPU의 설계 요소에 대해 알아봅니다. GPU의 설계에는 파면을 생성하는 대령의 파견 명령 프로세서가 포함되어 있으며, 이는 공간에 맞는 충분한 리소스가 있는 사용 가능한 SIMD 장치에 할당됩니다. 전체 칩에는 크로스바 및 캐시를 위한 8개의 GDDR5 메모리 뱅크가 있는 20개의 Cindy 엔진이 있습니다. 또한 가시성 권한을 보장하기 위해 펜스 명령이 필요한 완화된 글로벌 메모리 일관성 모델을 갖추고 있어 Cindy 엔진 및 고정 장치가 전력 성능 오버헤드 없이 가능한 한 높은 수준의 데이터 병렬 실행을 유지할 수 있습니다. GPU는 절 기반 실행 모델을 사용하여 가장 간단한 엔진에서 많은 제어 흐름 프로그램을 동시에 실행할 수 있습니다.

  • 00:40:00 이 섹션에서는 GPU 엔진 블록의 아키텍처에 대해 설명합니다. 엔진 블록에는 작업 그룹의 작업 항목과 사후 테스트 요소 간에 데이터를 공유할 수 있는 로컬 데이터 공유 또는 커널의 ALU 절에서 명령을 실행하는 스트림 코어의 두 가지 주요 구성 요소가 있습니다. 로컬 데이터 공유에는 32개의 뱅크가 있으며 엔진의 16개 처리 요소 각각은 임의의 주소에서 각 주기의 LDS에서 32비트 워드를 읽거나 쓰도록 요청할 수 있으며 장치에서 충돌을 감지합니다. 원자 연산은 정수 전용 ALU를 사용하여 수행되며 부동 소수점 원자 연산은 수행하기가 더 복잡합니다. 5870 아키텍처의 처리 요소는 컴파일러에 의해 패키징된 5개의 작업으로 구성된 매우 긴 명령어 패킷에서 작동하는 5개의 동일한 ALU 클러스터이며 일부 자체 종속성 집합과 함께 대부분의 기본 작업을 실행할 수 있습니다.

  • 00:45:00 이 섹션에서 발표자는 단일 패킷에서 종속 작업을 실행하고 글로벌 베타 공유로 종속 카운터를 지원하는 것을 포함하여 컴파일러가 수행할 수 있는 패킹의 양을 늘리는 데 도움이 되는 다양한 GPU 아키텍처 기능에 대해 설명합니다. 글로벌 베타 공유는 장치의 전체 컴퓨팅 엔진 집합에 연결되고 다른 메모리에 액세스하는 것보다 대기 시간이 훨씬 짧은 잘 알려지지 않은 기능입니다. 발표자는 또한 텍스처 캐시의 임의 픽셀에 액세스하면 데이터가 함께 클러스터링된 경우에만 글로벌 메모리 액세스를 수행하는 것보다 빠르기 때문에 성능 문제가 발생할 수 있다고 경고합니다.

  • 00:50:00 이 섹션에서 발표자는 GPU 아키텍처에서 전체 점유 달성과 관련된 질문에 답합니다. 주어진 예는 전체 점유를 얻기 위해 작업 그룹이 64개의 작업 항목의 배수로 구성되어야 한다는 것입니다. 웨이브프론트 및 각 코어에 맞을 수 있는 웨이브프론트의 수 또한 전체 점유에 영향을 미칩니다. 화자는 또한 코드의 필요에 따라 충분할 수도 있고 충분하지 않을 수도 있는 빠른 근사치인 5차선에 의해 생성된 초월 함수의 완전한 정밀 버전이 없다고 언급합니다. 모든 디바이스 내에서 웨이브프론트 크기를 쿼리할 수 있는 방법이 있느냐고 물으면 그런 방법이 없다고 대답합니다.

  • 00:55:00 이 섹션에서 발표자는 GPU 아키텍처에서 전역 메모리 액세스 측면에서 완전히 통합된 것이 무엇을 의미하는지 설명합니다. 본질적으로 이는 1/4 파동이 각 레인이 컴퓨팅 유닛을 가로지르는 정렬된 주소에서 연속적으로 128비트에 액세스하는 메모리 요청을 발행한다는 것을 의미합니다. 그러나 액세스 유형, 첨부 또는 분리 여부, 임의 수집 여부에 따라 효율성 수준이 있습니다. 또한 화자는 웨이브프론트가 하나의 명령으로 함께 실행되는 64개의 작업 항목으로 구성된 작업 단위이며 작업 항목의 집합인 작업 그룹과 동일하지 않다고 설명합니다.

  • 01:00:00 이 섹션에서 발표자는 GPU 아키텍처의 장벽 개념을 설명합니다. 작업 그룹에 여러 파면이 있는 경우 배리어 명령을 내리면 이러한 파면이 동기화됩니다. 그러나 그룹에 작업 웨이브프론트가 하나만 있으면 장벽이 비작업으로 축소되고 의미가 없습니다.
 

AMD Developer Central: OpenCL 프로그래밍 웨비나 시리즈. 4 OpenCL 프로그래밍 세부 사항



4 - 자세한 OpenCL 프로그래밍

이 비디오에서 연사는 OpenCL 프로그래밍에 대한 개요를 제공하고 해당 언어, 플랫폼 및 런타임 API에 대해 논의합니다. 세분화된 병렬화, 작업 항목 및 그룹 또는 스레드, 동기화 및 메모리 관리가 필요한 프로그래밍 모델에 대해 자세히 설명합니다. 그런 다음 연사는 n-바디 알고리즘과 계산 순서 n-제곱 특성에 대해 논의합니다. 그들은 OpenCL 커널 코드가 뉴턴 역학에서 입자의 위치와 속도를 업데이트하는 방법, 하나의 입자 위치를 저장하기 위해 캐시를 도입하는 방법, 커널이 부동 벡터 데이터 유형을 사용하여 입자 위치와 속도를 업데이트하는 방법을 설명합니다. 또한 연사는 매개 변수와 인수를 명시적으로 설정하고, 호스트와 GPU 간에 데이터를 전송하고, 동기화를 위해 커널 실행을 대기열에 추가하여 호스트 코드가 OpenCL 커널과 상호 작용하는 방식에 대해 자세히 설명합니다. 마지막으로 이 동영상에서는 OpenCL 코드를 수정하여 여러 장치를 지원하고, GPU 간에 데이터를 동기화하고, 이를 나타내는 절반 크기 배열에 대한 장치 ID를 설정하는 방법을 살펴봅니다.

두 번째 부분에서는 OpenCL 프로그래밍의 다양한 측면에 대해 설명합니다. 두 배열 사이에서 업데이트된 입자 위치를 동기화하기 위한 이중 버퍼 체계, OpenCL 제한 사항, 메모리 할당에서 전역 포인터와 로컬 포인터 간의 차이와 같은 주제를 다룹니다. 또한 프로파일링 도구와 같이 OpenCL 구현을 분석하는 데 사용할 수 있는 도구와 함께 벡터 작업, 제어된 메모리 액세스 및 루프 풀기를 포함하여 OpenCL 프로그래밍을 위한 최적화 기술을 강조합니다. 발표자는 OpenCL 프로그래머를 위한 리소스로 OpenCL 표준을 권장하고 표준 및 ATI Stream SDK에 대한 URL을 제공합니다. 비디오는 메모리 공유, 코드 최적화, 메모리 할당 및 계산 단위 활용과 같은 주제에 대한 질문도 다룹니다.

  • 00:00:00 이 섹션에서 연사는 OpenCL 개념을 소개하고 하이브리드 CPU-GPU 아키텍처의 출현과 이들이 프로그래밍에 제기하는 문제에 대해 논의합니다. OpenCL은 업계 전반에서 지원되는 플랫폼 및 장치 독립적인 API를 제공하며 발표자는 OpenCL API의 세 부분인 언어 사양, 플랫폼 API 및 런타임 API에 대해 설명합니다. 실행 모델은 OpenCL 장치에서 실행될 실행 코드를 나타내는 커널과 메모리 관리를 수행하고 명령 대기열을 사용하여 하나 이상의 장치에서 커널 실행을 관리하는 호스트 프로그램의 두 부분으로 나뉩니다. 커널 프로그래밍에 사용되는 C 언어 확장은 ISO C99를 기반으로 하며 병렬성을 지원하기 위해 몇 가지 제한 사항과 추가 사항이 있습니다.

  • 00:05:00 이 섹션에서 발표자는 스레드 및 동기화 전반에 걸쳐 세분화된 병렬화를 필요로 하는 OpenCL의 프로그래밍 모델을 설명합니다. 작업 항목 및 작업 그룹은 스레드로 도입되며 동기화 및 공유 메모리에 대한 액세스 측면에서 특별한 속성을 가진 작업 그룹으로 그룹화됩니다. 발표자는 또한 호스트 측의 실행 모델을 다루며 장치, 프로그램 객체, 커널, 메모리 객체, 커널과 메모리 또는 데이터 전송 작업을 큐에 넣기 위한 명령 대기열을 포함하는 컨텍스트에서 모든 것이 함께 수집된다고 설명합니다. . OpenCL은 또한 분산 메모리가 있는 하이브리드 시스템의 메모리 특성을 반영하기 위해 다양한 유형의 메모리 계층 구조를 지원합니다.

  • 00:10:00 이 섹션에서 연사는 OpenCL 프로그래밍을 사용할 때 메모리 및 동기화 관리의 중요성에 대해 논의합니다. OpenCL은 완화된 메모리 일관성 모델을 가지고 있어 데이터 전송을 관리하고 데이터가 한 장치에서 다른 장치로 이동할 때 제어하는 것은 프로그래머의 책임입니다. 동기화는 여러 장치를 사용할 때 필수적이며 커널 실행 및 데이터 전송을 포함한 이벤트가 올바르게 동기화되었는지 확인하는 것은 프로그래머의 책임입니다. 발표자는 OpenCL에 대한 단순화된 인터페이스인 표준 CL의 사용을 소개하고 사용할 준비가 된 기본 컨텍스트를 제공하고 모든 장치를 포함하며 전체 OpenCL 기능에서 중단되지 않습니다. 또한 Standard CL은 OpenCL 장치 간에 공유할 수 있는 메모리를 할당하는 CL Maylock을 통해 메모리 관리를 단순화합니다.

  • 00:15:00 이 섹션에서 발표자는 기본 n-body 알고리즘에 대해 논의합니다. 이 알고리즘은 특정 형태의 입자-입자 상호 작용에 따라 nparticle의 움직임을 모델링합니다. 이 알고리즘에는 시스템의 다른 모든 입자와의 상호 작용 기여도를 합산하여 각 입자에 대한 힘을 계산하는 작업이 포함됩니다. 모든 입자에 대한 힘이 알려지면 입자 위치와 속도가 약간의 시간 간격에 걸쳐 업데이트됩니다. 이 프로세스는 모든 입자에 대해 반복되어 상호 작용력에 따라 움직이는 이러한 입자의 시뮬레이션을 생성합니다. 이 알고리즘은 계산적으로 n제곱차이므로 메모리 전송 대역폭에 제한이 있는 보조 프로세서를 사용하여 속도를 높일 수 있습니다. 전체 알고리즘은 C에서 불과 수십 줄의 코드로 작성할 수 있습니다.

  • 00:20:00 이 섹션에서 발표자는 입자 간의 상호 작용을 누적하는 루프를 통해 n-body 알고리즘의 구현을 설명합니다. 커널 코드는 OpenCL 관점에서 모범 사례를 사용하여 합리적으로 표준 구현을 제공하도록 설계되었지만 특정 아키텍처에 최적이 아닐 수 있습니다. 커널은 인덱스 공간 내의 모든 작업 항목에 대해 실행되며 각 스레드는 단일 입자의 위치와 속도 업데이트를 담당합니다. 응용 프로그램에는 시스템의 입자 수와 동일한 작업 항목 수가 있는 간단한 1차원 인덱스 기반이 있습니다. 호스트 코드는 OpenCL 장치의 초기화, 메모리 관리 및 조정 작업에도 필수적입니다.

  • 00:25:00 이 섹션에서 발표자는 뉴턴 역학에서 입자의 위치와 속도를 업데이트하기 위한 커널 코드를 소개합니다. 커널 코드의 프로토타입은 C 함수의 프로토타입과 유사하지만 주소 공간과 블로킹 체계의 사용을 규정하는 일부 한정자가 있습니다. 커널 코드는 별도의 파일에 저장되며 프로그램이 실행될 때 JIT(Just-In-Time) 컴파일에 사용됩니다. 그런 다음 발표자는 실제 물리 계산에 들어가기 전에 커널 코드가 크기 및 인덱스 결정을 수행하는 방법을 설명합니다. 글로벌 및 로컬 스레드 ID도 자세히 설명되며 발표자는 커널이 시스템의 모든 입자에 대해 자동으로 실행되기 때문에 외부 루프가 커널 코드에 내재되어 있다고 언급합니다.

  • 00:30:00 이 섹션에서는 발표자가 캐시를 사용하여 쌍별 힘 계산을 위한 OpenCL 커널 구현을 설명합니다. 커널은 하나의 입자 위치를 캐시하고 캐시를 채우기 위해 작업 그룹의 다른 작업 항목에 의존합니다. 64개의 입자 위치가 캐시되면 커널은 캐시된 입자 위치를 반복하고 C 코드에 표시된 것과 동일한 힘 계산을 구현하지만 OpenCL에 특정한 차이점이 있습니다. 여기에는 입자 위치에 대한 플로트 벡터 사용, 제곱근에 대한 OpenCL 내장 함수, 편의를 위해 플로트 벡터의 사용되지 않은 네 번째 구성 요소에 질량을 저장하는 것이 포함됩니다. 커널은 부동 벡터 데이터 유형을 사용하여 단일 시계에서 입자 위치와 속도를 업데이트합니다. 마지막으로 발표자는 캐시 채우기 및 루프 작업 중에 동기화를 위한 장벽의 필요성을 설명합니다.

  • 00:35:00 이 섹션에서는 다른 스레드에서 여전히 필요한 데이터를 덮어쓰지 않도록 새 배열의 전역 메모리에 새 위치와 새 속도를 다시 쓰는 방법에 대해 알아봅니다. 이 이중 버퍼링 체계는 스레드 동시성 문제가 발생하지 않고 파티클 위치를 안전하게 업데이트하기 위해 이후 단계에서 사용됩니다. 커널의 호스트 코드 구현으로 이동하여 프로그램이 매개 변수를 설정하고, 메모리를 할당하고, 위치 및 속도를 초기화하고, OpenCL 커널을 빌드 및 컴파일하고, 필요한 현재 n-body 커널을 이름으로 쿼리하고, 하나를 생성하는 방법에 대해 배웁니다. -차원 커널 계산 도메인이며 커널 인수를 명시적으로 설정합니다. 전반적으로 이 코드는 호스트가 프록시로 커널을 실행한다는 점과 커널에 대한 인수를 직접 설정해야 한다는 점에서 OpenCL이 기본 C 프로그램과 어떻게 다른지 보여줍니다.

  • 00:40:00 이 섹션에서 발표자는 clm 싱크 호출을 사용하여 호스트에서 GPU로 데이터를 전송하고 호출 차단 플래그를 사용하여 장치(GPU)의 배열을 동기화하는 프로세스를 설명합니다. 그런 다음 루프 오버 단계에 대해 논의하고 진단 목적으로 사용될 값과 버스트를 소개하고 이중 버퍼링을 위한 커널 인수 2 및 3 설정을 지연합니다. 발표자는 커널 실행이 대기열에 추가되고 진행하기 전에 모든 커널 실행이 완료되었는지 확인하기 위해 CL 대기 동기화 호출이 사용된다는 점에 주목합니다. 마지막으로 CL enqueue 읽기 버퍼를 사용하여 데이터를 GPU에서 호스트로 다시 가져옵니다.

  • 00:45:00 이 섹션에서는 비디오에서 여러 장치를 지원하도록 코드를 수정하는 방법, 특히 두 개의 GPU에서 코드를 실행하는 방법에 대해 설명합니다. 이 접근 방식은 입자의 절반을 담당하는 하나의 GPU와 함께 두 개의 GPU 사이에서 힘 계산 및 입자 위치 업데이트 작업을 나누는 것을 포함합니다. 커널 코드는 주어진 GPU가 업데이트를 담당하지 않지만 총 힘을 계산하기 위해 여전히 필요한 입자의 입자 위치를 가리키는 "position remote"라는 프로토타입에 추가된 추가 인수와 함께 거의 교환을 보지 않습니다. . 두 장치의 사용으로 인해 발생하는 메모리 관리 및 동기화 문제와 관련하여 호스트 측에 눈에 띄는 변경 사항이 있습니다.

  • 00:50:00 이 섹션에서는 두 개의 GPU에서 입자 시뮬레이션을 수행하기 위해 커널 코드에 필요한 변경 사항을 설명합니다. 캐시 파티클 위치에 대한 루프는 이전과 동일하게 유지되지만 21행 전에 루프는 이제 GPU가 소유한 로컬 파티클 위치에 있습니다. 그런 다음 다른 GPU가 업데이트를 담당하는 원격 입자에 대해 코드가 반복됩니다. 입자 위치 및 속도를 업데이트하는 코드는 동일하게 유지됩니다. 2개의 GPU에 대한 호스트 코드를 수정하기 위해 초기화는 동일하게 유지되지만 입자의 절반을 보유하는 입자 위치 및 속도에 대한 배열도 할당되며 A와 B는 2개의 GPU를 나타냅니다. 인덱스 공간이 원래 크기의 절반에 불과한 계산 영역이 생성되고 속도 배열에 대한 인수 포인터를 정적으로 설정하는 코드가 제거됩니다.

  • 00:55:00 이 섹션에서는 절반 크기의 배열을 각각의 GPU에 복사할 때 데이터를 쓸 GPU를 정의하기 위해 장치 ID를 설정하는 방법을 배웁니다. 또한 여러 GPU 간에 데이터를 교환하려면 업데이트된 입자 위치를 나타내는 절반 크기의 입자 배열을 전환하여 업데이트된 입자 위치를 GPU와 다시 동기화해야 합니다. 또한 일부 OpenCL 구현의 경우 진정한 동시성을 위해 CL 플러시 호출을 도입해야 할 수도 있지만 이는 표준의 일부가 아닙니다.

  • 01:00:00 이 섹션에서 발표자는 두 배열 간에 이전 입자 위치와 새 입자 위치를 교환하는 이중 버퍼 체계를 구현하는 코드를 살펴봅니다. 이 구성표는 업데이트된 입자 위치가 어레이 A 또는 B에 다시 배치되도록 합니다. 입자가 호스트에 동기화되면 일부 도우미 기능을 재사용하기 위해 입자를 더 큰 어레이로 다시 복사해야 합니다. 발표자는 OpenCL 프로그래머에게 필요한 자원으로 OpenCL 표준을 추천하고 표준과 ATI Stream SDK에 대한 URL을 제공한다. 발표자는 또한 OpenCL이 특이값 분해 또는 음이 아닌 행렬 분해와 같은 알고리즘에 사용될 수 있는지에 대한 질문에 답하고 GPU의 전역 메모리에 있는 데이터가 커널 실행 간에 동일하게 유지됨을 확인합니다. 이는 더 복잡한 알고리즘에 중요합니다.

  • 01:05:00 이 섹션에서 비디오는 Unix/Linux 시스템만 지원하고 Windows 포트용으로 작업 중인 OpenCL API의 현재 제한 사항에 대해 설명합니다. 이 비디오는 또한 GPU와 호스트 간의 메모리 공유 문제를 다루며 가능하지만 그래픽 카드에 할당된 전역 메모리를 사용하는 것이 일반적이므로 성능 저하가 있음을 설명합니다. OpenCL API를 통해 메모리를 할당할 때 처리 방법을 제어하는 방법이 있지만 이 중 일부는 구현 수준에서 자동으로 수행됩니다. 또한 이 비디오는 메모리 할당에서 전역 포인터와 로컬 포인터의 차이점과 실행 중인 알고리즘에 따라 최적의 코어 수를 선택하는 방법을 설명합니다.

  • 01:10:00 이 섹션에서 발표자는 FTL FGL RX 모듈을 로드하고 실행할지 여부, Lib 표준 CL과 C++ 바인딩의 호환성, 성능 향상을 위한 OpenCL 커널 최적화, 메모리 버퍼를 할당할 때 CL mem을 읽기 전용으로 사용하거나 읽기/쓰기를 봉인합니다. 발표자는 또한 OpenCL 커널을 편집하고 AMD GPU를 최적화하기 위한 특정 도구가 존재할 수 있음을 지적하는 동시에 최적화 기술이 매우 미묘하고 많은 조정이 필요할 수 있음을 지적합니다.

  • 01:15:00 이 섹션에서 발표자는 벡터 작업을 활용하기 위한 데이터 구성, 성능 향상을 위한 신중한 메모리 액세스 제어, 최적화를 위한 루프 수동 풀기 등 OpenCL 프로그래밍을 위한 최적화 기술에 대해 논의합니다. 또한 복잡한 데이터 유형의 사용과 호스트로 돌아가지 않고 GPU 간에 데이터를 전송하는 기능은 구현에 따라 다르며 컴파일러에 따라 다를 수 있습니다. 연사는 또한 시스템의 OpenCL 장치 전체에서 사용 가능한 메모리에 따라 달라지는 메모리 버퍼의 크기 제한이 있다고 언급합니다. 더 나은 성능을 위해 더 간단한 float 매개변수를 상수 메모리에 저장하는 것이 가능할 수 있습니다.

  • 01:20:00 이 섹션에서 발표자는 계산 단위 활용 또는 메모리 전송 활용을 측정하기 위한 프로파일링 도구를 포함하여 OpenCL 구현을 분석하기 위해 다양한 SDK에서 사용할 수 있는 도구가 있다고 설명합니다. 발표자는 또한 GPU 측에서 메모리 조각화를 관리하는 것은 구현에 따라 다르며 구현에서 이를 적절하게 관리해야 함을 분명히 합니다. 배정밀도를 사용하는 경우 로컬 작업 그룹 크기를 32 또는 16으로 낮출지 여부에 대한 명확한 대답은 사용 중인 아키텍처에 따라 다릅니다. 발표자는 또한 표준 GPU 컨텍스트 내에서 모든 장치에 대한 정보를 쉽게 얻기 위한 도우미 호출의 가용성에 대해 언급합니다.
 

AMD Developer Central: OpenCL 프로그래밍 웨비나 시리즈. 5. 실제 OpenCL 응용 프로그램



5 - 실제 OpenCL 애플리케이션

이 비디오에서 Joachim Deguara는 성능 최적화에 중점을 두고 작업한 멀티 스트림 비디오 처리 애플리케이션에 대해 이야기합니다. 이 비디오는 비디오 형식 디코딩, DMA를 사용하여 CPU와 GPU 간에 메모리 전송, 더블 버퍼링, 커널 실행, 이벤트 개체를 사용하여 작업 동기화 및 프로파일링, OpenCL-OpenGL 상호 운용성, 비디오에서 스와이프 처리 및 다음 중에서 선택과 같은 다양한 주제를 다룹니다. 알고리즘을 처리할 때 OpenCL 및 OpenGL. 또한 Joachim은 OpenCL 응용 프로그램에 사용할 수 있는 다양한 샘플링 및 SDK에 대해 설명하지만 현재 비디오에서 논의된 특정 응용 프로그램에 사용할 수 있는 샘플 코드가 없다고 언급합니다.

  • 00:00:00 이 섹션에서 Joachim Deguara는 자신이 작업한 다중 스트림 비디오 처리 응용 프로그램에 대해 설명합니다. 이 응용 프로그램에는 여러 비디오 스트림 열기, 디코딩, 비디오 효과 적용, 결합 및 최종적으로 마지막에 반복적으로 처리되는 하나의 비디오 스트림 표시가 포함됩니다. Joachim Deguara는 성능이 이 애플리케이션의 핵심 초점이며 실시간 프레젠테이션을 달성하기 위해서는 초당 30회 발생하는 루핑 구조 또는 입력 비디오의 프레임 속도에 디코딩, 처리 및 표시를 맞추는 것이 필수적이라고 언급했습니다. .

  • 00:05:00 이 섹션에서는 비디오 형식을 디코딩하고 프레임을 GPU로 이동하는 데 중점을 둡니다. 비디오 형식을 디코딩하려면 성능에 영향을 미치지 않도록 가능한 한 빨리 수행되도록 해야 합니다. 이를 수행하는 한 가지 방법은 디코드 기능을 메인 루프와 별도로 실행하고 호출 시 최신 프레임을 반환하도록 하는 것입니다. 이렇게 하면 기본 루프가 중단되지 않고 계속되는 동안 백그라운드에서 디코딩이 수행됩니다. 프레임을 GPU로 이동하기 위해 쓸 이미지를 지정하고 쓰기가 동기적으로 또는 비동기적으로 발생해야 하는지 여부를 포함하는 API 호출이 사용됩니다.

  • 00:10:00 이 섹션에서 발표자는 DMA(직접 메모리 액세스)와 CPU가 복사할 필요 없이 시스템의 주 메모리와 GPU 메모리 간에 메모리를 전송하는 데 어떻게 사용할 수 있는지에 대해 설명합니다. DMA 엔진은 이 작업을 병렬로 처리하여 CPU 및 GPU의 리소스를 확보합니다. 버퍼 및 이미지 전송은 비동기적으로 수행될 수 있으며 특수 플래그가 필요합니다. 그러나 데이터는 복사 후 즉시 사용할 수 없으므로 DMA를 활용하기 위해 프로그램을 재구성해야 합니다. 발표자는 현재 처리되거나 표시된 데이터가 손상되지 않도록 이중 버퍼링 및 구조 조정 루프 프로세스를 제안합니다. 전반적으로 DMA는 CPU 및 GPU 주기를 오프로드하여 애플리케이션 성능을 크게 향상시킬 수 있습니다.

  • 00:15:00 이 섹션에서 발표자는 비디오 프레임을 처리하고 표시하기 위해 OpenCL에서 사용되는 이중 버퍼링 접근 방식에 대해 설명합니다. 이 접근 방식에는 두 프레임 A와 B를 지속적으로 버퍼링하고 다른 프레임이 업로드되는 동안 하나를 처리하는 것이 포함됩니다. 이렇게 하면 처리 시간과 업로드 시간을 합산할 필요가 없으며 대신 각 프로세스에 걸리는 최대 시간만 걸립니다. 발표자는 또한 매개변수를 변경할 필요가 없는 경우 한 번만 수행하면 되고 이후의 모든 처리 실행에 사용할 수 있는 커널에 대한 인수 설정에 대해 설명합니다.

  • 00:20:00 이 섹션에서 화자는 커널을 실행하는 방법에 대해 논의하고 차단 및 비차단 방법을 포함하여 처리를 호출하는 두 가지 방법을 언급합니다. 차단을 사용하면 디버깅이 더 쉬워지지만 성능에는 최적이 아니므로 연사는 이벤트 및 이벤트 벡터를 사용하여 작업을 기다리거나 여러 작업에 대한 종속성 그래프를 설정하는 옵션을 소개합니다. 이벤트 개체를 사용하여 특정 작업 항목의 완료 신호를 보내면 다운스트림 작업이 완료된 후에만 시작되도록 하여 보다 효율적으로 처리할 수 있습니다.

  • 00:25:00 이 섹션에서는 발표자가 OpenCL 이벤트 개체를 사용하여 작업을 동기화하는 방법과 성능 테스트를 위해 이벤트 프로파일링을 사용하는 방법을 설명합니다. 필터에 대한 종속성 그래프를 생성할 때 Enqueue Operation의 마지막 인수로 이벤트에 대한 포인터가 전달되지만 이벤트 개체는 InQ 내부에 생성됩니다. 이로 인해 혼란이 생길 수 있지만 필터와 업로드 작업 간의 종속성을 설정할 수 있습니다. 발표자는 이벤트 프로파일링을 사용하여 이벤트 참조의 작업이 대기열에 추가되고 제출되고 실행되기 시작했을 때와 같이 이벤트 수명 주기에서 특정 이벤트가 발생한 시간에 대해 이벤트에서 타임스탬프를 다시 가져올 수 있는 방법을 설명합니다. 그리고 실행을 완료했습니다. 이를 통해 모든 작업을 비동기식으로 유지하면서 프로파일링이 가능합니다.

  • 00:30:00 비디오의 이 섹션에서 발표자는 대기, 제출, 실행 및 완료와 같이 OpenCL을 사용할 때 이벤트가 진행되는 다양한 상태와 이벤트 프로필 데이터 및 타임스탬프를 사용하여 성능을 측정하는 방법을 설명합니다. 작업 또는 데이터 업로드를 위한 긴 실행 시간과 같은 잠재적인 문제를 식별합니다. 발표자는 다양한 필터와 효과를 사용하여 비디오 스트림을 정확하게 표시하기 위해 이벤트가 완료될 때까지 기다리는 방법에 대해서도 설명합니다.

  • 00:35:00 이 섹션에서 발표자는 둘 사이에 특정 정보를 공유할 수 있는 OpenCL 및 OpenGL 상호 운용성에 대해 설명합니다. 이 기능은 선택 사항이므로 모든 구현에서 이를 지원해야 하는 것은 아닙니다. 발표자는 확장을 확인하고 OpenCL-OpenGL 상호 운용성을 켜기 위해 특정 플래그를 사용하여 OpenCL에서 컨텍스트를 생성하는 것의 중요성을 강조합니다. 이것이 작동하는 방식은 이미 생성된 OpenGL 텍스처에서 OpenCL 이미지를 생성하는 것이므로 데이터가 불필요하게 앞뒤로 복사되지 않습니다.

  • 00:40:00 이 섹션에서는 발표자가 OpenCL과 OpenGL이 어떻게 Interop을 통해 이미지 데이터를 함께 공유할 수 있는지 설명합니다. Open GL 텍스처를 참조하는 데 필요한 대상, NIP 수준 및 텍스처 개체를 다룹니다. 생성된 OpenCl 이미지는 일반 OpenCl 이미지로 사용할 수 있지만 두 프로그램은 서로 간섭하지 않도록 하기 위해 일부 핸드쉐이킹을 수행해야 합니다. 발표자는 또한 비디오 렌더링에서 전환을 생성하는 방법에 대한 질문에 답합니다. 그는 스 와이프 위치를 필터에 대한 입력으로 사용하여 수행 할 수 있다고 말합니다. 궁극적으로 최종 결과는 모든 단계를 완료하는 표시 목적으로 OpenGL로 전환됩니다.

  • 00:45:00 이 섹션에서 발표자는 각 프레임의 시간 마커를 보고 키프레임을 사용하여 스와이프 위치를 보간하여 동영상에서 스와이프를 처리하는 방법을 설명합니다. 그들은 또한 타임스탬프가 외부 고해상도 타이머에 의존하지만 CL 완료에 대한 호출에는 의존하지 않는다는 OpenCL의 프로파일링에 대한 질문에 답합니다. 또한 연사는 OpenCL 장치 및 런타임의 실행 순서에 대해 논의하고 대부분의 장치에서 작업이 순서대로 처리되는지 확인합니다.

  • 00:50:00 이 섹션에서는 발표자가 알고리즘을 처리할 때 OpenCL과 OpenGL의 차이점을 탐구합니다. OpenCL은 포괄적인 언어 구조로 인해 프로그래밍하기가 더 쉬울 수 있지만 사용할 플랫폼의 결정은 개인의 선호도에 따라 다릅니다. 성능 면에서 OpenCL은 더 복잡한 하드웨어가 필요한 처리 응용 프로그램을 허용할 수 있습니다. 그러나 OpenGL 음영을 사용하면 성능이 향상될 수 있는 경우가 있습니다. 또한 발표자가 특정 애플리케이션에 사용할 수 있는 샘플 코드를 제공할 수는 없지만 AMD의 OpenCL SDK에는 사용자가 배울 수 있는 다양한 코드 예제가 있습니다.

  • 00:55:00 이 섹션에서는 발표자가 OpenCL 애플리케이션용 개발자가 사용할 수 있는 다양한 샘플과 SDK에 대해 설명합니다. 샘플은 OpenCL OpenGL 상호 운용의 예를 제공할 뿐만 아니라 확장을 가져오기 위해 장치 및 런타임을 쿼리하는 방법을 보여줍니다. 그러나 현재 비디오에서 논의된 특정 애플리케이션에 사용할 수 있는 샘플 코드는 없지만 향후 변경될 수 있습니다. 이제 웨비나가 종료되었으며 녹화본이 참석자에게 제공됩니다.
 

AMD Developer Central: OpenCL 프로그래밍 웨비나 시리즈. 6. OpenCL용 장치 핵분열 확장



6 - OpenCL용 장치 분열 확장

이 비디오에서 발표자는 OpenCL용 장치 핵분열 확장과 관련된 다양한 주제를 다룹니다. 다양한 유형의 확장과 장치 분열을 통해 큰 장치를 작은 장치로 나누는 방법을 설명합니다. 이는 우선 순위가 높은 작업을 위해 코어를 예약하거나 특정 작업 그룹을 특정 코어에 할당하는 데 유용합니다. 그들은 벡터 푸시백 작업을 병렬화하고 병렬 패턴을 사용하여 프로세스를 최적화하고 OpenCL에서 네이티브 커널을 생성할 때 순차적인 의미론을 유지하는 것의 중요성에 대해 논의합니다. 연사는 또한 OpenCL용 장치 분열을 활용하는 응용 프로그램을 시연하고 메모리 선호도와 다른 장치에서의 장치 분열의 미래에 대해 논의합니다.

  • 00:00:00 이 섹션에서 발표자는 OpenCL의 확장, 특히 KHR 확장, EXT 확장 및 공급업체 확장의 세 가지 유형의 확장에 대해 설명합니다. KHR 확장은 OpenCL 작업 그룹의 승인을 받았으며 일련의 적합성 테스트와 함께 제공됩니다. EXT 확장은 최소 두 명의 작업 그룹 구성원이 개발하며 적합성 테스트가 필요하지 않습니다. CL_AMD_printf와 같은 공급업체 확장은 단일 공급업체에서 개발했으며 해당 공급업체에서만 지원될 수 있습니다. 모든 확장에 대한 문서는 Chronos OpenCL 레지스트리 웹 사이트에서 제공되므로 벤더 간에 투명성과 액세스가 가능합니다.

  • 00:05:00 이 섹션에서 발표자는 장치 비전이라는 OpenCL용 장치 핵분열 확장을 언급합니다. 이 확장을 통해 사용자는 이름 또는 메모리 친화도에 따라 컴퓨팅 유닛이 많은 대형 장치를 더 작은 OpenCL 장치로 나눌 수 있습니다. 이 부서는 SMP 기반 시스템에서와 같이 우선 순위 작업을 위해 코어를 예약하거나 특정 작업 그룹을 특정 코어에 할당하는 데 도움이 될 수 있습니다. 발표자는 OpenCL 위에 구축된 병렬 알고리즘 및 병렬 컨테이너의 예를 통해 디바이스 비전 사용에 동기를 부여하고 이 확장이 현재 CPU 및 Cell Broadband 디바이스에서 AMD와 IBM에 의해 지원된다고 말합니다.

  • 00:10:00 이 섹션에서 발표자는 벡터 푸시백 작업을 병렬화하면서 순차적인 의미 체계를 유지하는 것의 중요성에 대해 논의합니다. 그들은 순차 루프 중에 벡터에 요소를 삽입할 때 예상되는 순서가 루프의 함수로 나타날 것이라고 설명합니다. 그러나 병렬화되면 이 순서가 손실되고 요소가 순서 없이 삽입될 수 있으므로 화자는 벡터 푸시백 작업의 순차적인 의미를 유지할 것을 제안합니다. 그런 다음 MPEG-2 스트림의 단순화된 버전과 같은 응용 프로그램에서 이것이 어떻게 필수적일 수 있는지에 대한 예를 제공합니다. 그들은 C 함수를 소개하고 CPU에서 이러한 병렬 작업을 구현하는 방법을 논의함으로써 결론을 내립니다.

  • 00:15:00 이 섹션에서 발표자는 병렬 패턴을 사용하여 OpenCL 프로세스용 Device Fission Extensions를 최적화하는 방법을 설명합니다. 그들은 파이프라인 패턴을 사용하여 기능을 병렬로 실행하고 로컬 메모리에서 하나의 작업 항목을 처리하기 위해 입력 데이터에서 읽을 데이터 블록을 도입합니다. 그런 다음 접근 방식은 사서함의 오프셋을 해당 작업 그룹에 기록하여 출력 순서를 유지하면서 오프셋을 계산합니다. 순서는 임의의 순서로 실행될 수 있는 글로벌 ID에 의존하는 대신 작업 그룹 간의 통신을 통해 이루어집니다. 파이프라인 패턴은 기능이 병렬로 실행되어 프로세스를 최적화하도록 합니다.

  • 00:20:00 이 섹션에서 연사는 파이프라인에 대해 논의하고 단순히 물건을 세는 것 이상으로 "카운터"라는 용어를 사서함으로 사용하는 방법에 대해 설명합니다. 그들은 사서함에 대한 인덱싱을 위해 그룹 ID를 전달하고 간단한 계산을 위해 로컬 및 전역 메모리를 사용한다고 설명합니다. 그러나 그들은 작업 그룹 실행에 대한 보장이 없다는 점에 주목하고 이것이 어떻게 교착 상태 상황을 유발할 수 있는지 설명합니다. 이 문제를 해결하기 위해 발표자는 디바이스 비전을 사용하여 디바이스를 두 개의 개별 코어로 나누고 각 코어에서 하나의 작업 그룹을 시작하고 진행을 보장할 것을 제안합니다. 또한 호스트 장치에서 실행하기 위해 OpenCL에서 제공하는 중요한 메커니즘을 소개합니다.

  • 00:25:00 이 섹션에서 발표자는 OpenCL에서 네이티브 커널을 사용하여 임의의 C 또는 C++ 기능을 실행할 수 있는 이점에 대해 논의합니다. OpenCL에서 사용할 수 없는 표준 I/O 루틴 또는 기타 라이브러리 함수를 호출하는 기능뿐만 아니라 다양한 구현을 시도할 때 더 많은 유연성을 제공할 수 있습니다. OpenCL에서 네이티브 커널을 생성하는 프로세스에는 인수 및 메모리 개체와 함께 명령 대기열 및 함수를 전달하는 작업이 포함됩니다. 그러나 함수가 포함된 동일한 스레드에서 실행되지 않을 수 있으므로 스레드 로컬 저장소에 주의해야 합니다. 발표자는 또한 C API 위에 몇 가지 추상화를 제공하는 OpenCL C++ 바인딩 API를 소개합니다. 프로그램은 사용 가능한 플랫폼을 쿼리하고 컨텍스트 및 장치 유형을 생성하는 것으로 시작합니다.

  • 00:30:00 이 섹션에서 발표자는 OpenCL용 장치 핵분열 확장의 사용에 대해 논의합니다. 유효한 장치가 쿼리되면 장치 목록이 반환되고 장치 핵분열을 지원하기 위해 첫 번째 장치가 선택됩니다. 장치 분열은 OpenCL API의 새로운 기능이며 파티션을 설명할 수 있는 확장 메커니즘이 필요합니다. 파티션을 동일하게 사용하여 1개 단위의 장치로 분할합니다. 그런 다음 하위 장치 속성이 설정되고 하위 장치 생성 기능이 호출됩니다. 하나 이상의 하위 장치가 생성되었다고 가정하면 사서함이 만들어지고 각 장치에 대한 명령 대기열이 생성됩니다. 결과 장치는 다른 장치와 완전히 동일하며 기존 라이브러리와 상호 교환하여 사용할 수 있습니다. 그런 다음 스피커는 기본 OpenCL 커널 설정으로 이동합니다.

  • 00:35:00 이 섹션에서는 발표자가 OpenCL용 Device Fission 확장을 구현하는 데 필요한 입력과 인수에 대해 설명합니다. 발표자는 입력용 메모리 버퍼가 네 부분으로 나뉘며 포인터는 FN c 런타임에 의해 배치될 것이라고 설명합니다. 메모리 버퍼는 사서함, 블록 및 캐시 트랜잭션으로 구성되며 각 커널에 대해 고유한 ID가 생성됩니다. 발표자는 커널의 각 인스턴스가 개별 장치에서 실행될 것이며 모든 이벤트가 완료되면 패딩이 삽입된 상태로 데이터가 기록될 것이라고 설명합니다. 커널 자체에는 효율적인 실행을 보장하기 위해 차단 및 캐싱과 관련된 최적화가 포함됩니다.

  • 00:40:00 이 섹션에서 발표자는 OpenCL용 장치 핵분열을 활용하는 응용 프로그램의 구현에 대해 논의합니다. 입출력, 사서함, 로컬 블록 배열, 블록 크기 및 그룹 ID와 같은 다양한 유형을 사용하여 데이터 세트를 병렬로 인덱싱함으로써 애플리케이션이 작동하는 방식을 설명합니다. 또한 이 애플리케이션은 간단한 바쁜 대기 및 차단 최적화를 구현하여 모든 것이 최대한 병렬로 실행되도록 합니다. 장치 핵분열을 활용함으로써 이 애플리케이션의 구현은 ALU 작업이 거의 또는 전혀 없이 CPU에서 속도 향상을 달성할 수 있는 가능성을 보여줍니다. 이는 향후 더 넓은 벡터의 구현으로 더욱 증가할 수 있습니다. 연사는 또한 무한대 및 Numa 공간 시스템에 대한 분할과 같은 장치 핵분열의 다른 응용 프로그램 및 사용 사례에 대해 논의합니다.

  • 00:45:00 이 섹션에서 발표자는 특정 장치와 버퍼의 정확한 연결을 허용하는 OpenCL의 메모리 선호도의 이점에 대해 논의합니다. 이는 경합 및 부정적인 공유를 방지하여 더 나은 캐시 지역성과 향상된 성능으로 이어질 수 있습니다. OpenCL에서 사용되는 메일박스 체계는 여러 반복을 지원하도록 확장할 수 있으므로 폭포수 파이프라인을 계속해서 시작하는 루프를 허용합니다. 연사는 또한 developer.amd.com의 OpenCL 영역에서 리소스를 사용할 수 있다고 언급합니다. 여기서 관심 있는 사용자는 웨비나, 과거 프레젠테이션, 이기종 컴퓨팅에 대한 향후 정상 회담을 포함하여 OpenCL에 대한 자세한 정보를 찾을 수 있습니다. 발표자는 또한 미래에 GPU에서 장치 핵분열을 지원할 가능성을 암시합니다. 그러면 우선 순위가 높은 작업을 위해 코어의 일부를 예약하고 더 나은 성능을 보장할 수 있습니다.

  • 00:50:00 비디오의 이 섹션에서 발표자는 다른 장치로 이동하는 장치 핵분열의 미래에 대해 논의합니다. 현재 AMD와 IBM만이 OpenCL용 장치 핵분열 확장을 지원하지만 다른 공급업체도 제안에 관심을 보였습니다. BLAS 및 FFT와 같은 수학 라이브러리가 지원되는지 여부에 대한 질문이 제기되며 발표자는 BLAS의 OpenCL 구현과 FFT 스타일 라이브러리에서 제공될 선형 대수에 대한 다양한 변형 및 구현에 대해 작업하고 있음을 확인합니다.
 

AMD Developer Central: OpenCL 프로그래밍 웨비나 시리즈. 7. 매끄러운 입자 유체역학




7 - 매끄러운 입자 유체역학

이 비디오에서는 유체 역학 방정식, 특히 Navier-Stokes 방정식을 푸는 기술인 SPH(Smoothed Particle Hydrodynamics)에 대해 설명합니다. 비디오는 밀도, 압력 및 점도 항을 포함하여 방정식의 다양한 항과 스무딩 커널을 사용하여 근사치를 구하는 방법을 설명합니다. SPH에 사용되는 수치 알고리즘과 공간 인덱싱 및 Interop 사용에 대해서도 설명합니다. 발표자는 공간 인덱스와 이웃 맵을 구성하는 과정과 물리 계산 방법을 설명합니다. 비디오는 시청자에게 프로그램을 다운로드하고 사용하도록 초대하고 시뮬레이션의 한계에 대해 논의합니다. 그런 다음 발표자는 GPU 성능, 비압축 동작 및 캐시된 이미지 사용에 대한 청중의 질문에 답합니다.

  • 00:00:00 이 섹션에서는 AMD의 선임 기술 직원인 Alan Hierich가 전산 유체 역학, 특히 매끄러운 입자 유체 역학(SPH)에 대한 개요를 제공합니다. SPH는 원래 천체물리학 계산에 사용되었지만 비디오 게임 및 시뮬레이션에서 상당히 인기를 얻었습니다. 이 기술은 Navier-Stokes 방정식을 푸는 데 사용됩니다. Navier-Stokes 방정식은 1900년대에 공식화되었으며 오늘날 대부분의 유체 역학 작업의 기초가 되는 편미분 방정식입니다. Allen은 유체의 정의를 설명하고 액체와 기체에 초점을 맞춰 작동 방식에 대한 직관적인 설명을 제공합니다. 또한 유체는 일반적으로 Navier-Stokes 방정식으로 설명되며 비압축성 Navier-Stokes 방정식은 정상 속도 및 정상 온도에서 물과 같은 유체를 지배한다고 설명합니다.

  • 00:05:00 이 섹션에서 연사는 Navier-Stokes 방정식으로 알려진 유체를 지배하는 방정식을 설명합니다. 운동 방정식은 중력, 압력 및 점도의 함수로 속도의 변화를 나타내는 반면, 질량 연속성 방정식은 질량이 생성되거나 소멸되지 않는다는 것을 나타냅니다. 유체를 지배하는 현상은 중력, 압력, 속도이고 점도는 유체 입자가 같은 방향으로 이동할 가능성을 결정하는 유체의 끈적임입니다. 정원 호스의 노즐과 같은 더 작은 개구부를 통해 유체가 이동할 때 유체의 가속을 설명하는 대류 가속도 용어도 논의됩니다. 발표자는 시연된 상자 안의 유체를 시뮬레이션하는 프로그램을 다운로드하여 재생하도록 청중을 초대합니다.

  • 00:10:00 이 섹션에서 발표자는 대류 가속도, 압력 구배 및 점도를 포함하여 유체 역학에 대한 운동 방정식의 다양한 용어를 설명합니다. 압력은 한 지점에서의 유체의 실제 밀도와 정지 밀도 사이의 차이로 정의됩니다. 운동방정식 우변의 마지막 항인 점성항은 계의 운동량을 확산시켜 궁극적으로 모든 위치에서 속도가 등가인 상태를 이룬다. 또한 질량 연속성 방정식 del dot V = 0이 있는데, 이는 비압축 방정식에서 질량이 생성되지도 소멸되지도 않는다는 것을 의미합니다. 마지막으로 시스템의 동역학을 나타내기 위해 스피커는 방정식의 재료 파생물을 사용하여 입자의 운동 방정식을 얻습니다.

  • 00:15:00 이 섹션에서 비디오는 이전 섹션에서 소개된 단순화된 비압축성 Navier-Stokes 방정식을 풀기 위한 매끄러운 입자 유체역학(SPH) 기술에 대해 설명합니다. SPH 기술은 천체 물리학과 은하 연구를 위해 1992년에 처음 도입되었지만 유체 방정식에도 사용할 수 있습니다. 여기에는 가중 함수를 곱한 인근 지점의 양 합계로 모든 양을 근사화할 수 있는 기본 함수와 같은 양의 평활화 커널 표현을 도입하는 것이 포함됩니다. SPH 기술은 Navier-Stokes 방정식에서 밀도 및 압력 구배 항을 근사화하는 데 사용됩니다. 비디오는 또한 Navier-Stokes 방정식이 스케일에 수치적으로 민감하며 입자를 공간에서 이동시키기 위해 일반 공간 스케일로 확장되기 전에 더 작은 스케일에서 계산이 수행된다고 언급합니다.

  • 00:20:00 이 섹션에서 발표자는 SPH(Smoothed Particle Hydrodynamics)에서 근사화되는 세 가지 주요 용어인 밀도, 압력 및 점도 용어를 설명합니다. 밀도를 계산하기 위해 프로그램은 다양한 지점에서 입자의 질량을 계산하고 평활화 커널의 기울기를 곱합니다. 그런 다음 압력 항은 밀도로 나눈 압력의 스칼라 양을 사용하여 계산되며, 여기에 스무딩 커널의 기울기가 곱해집니다. 한편, 점성 항은 유체 점성의 정도와 두 점 사이의 속도 차이를 점 J의 밀도로 나눈 값을 결정하는 스칼라 계수를 사용하여 근사화됩니다. 화자는 스무딩 커널의 속성도 설명하는데, 이는 다음과 같습니다. SPH 시뮬레이션에 사용되는 방법과 반지름이 H인 구에서 1이 되는 방법.

  • 00:25:00 이 섹션에서 발표자는 SPH(Smoothed Particle Hydrodynamics)에 사용되는 수치 알고리즘에 대해 설명합니다. 이 알고리즘에는 밀도, 압력, 압력 구배, 점성 항 및 가속도 계산이 포함되며, 입자의 속도와 위치를 시간 단계로 지정하는 데 사용됩니다. 발표자는 초기 알고리즘이 모든 입자에 대한 모든 입자의 상호 작용을 테스트하는 것을 포함하며 이는 정확하지만 충분히 빠르지는 않다고 설명합니다. 따라서 공간을 복셀로 분할하여 상호 작용 반경 내의 입자와만 상호 작용할 수 있는 더 나은 알고리즘이 도입되었습니다. 또한 입자의 하위 집합은 모든 입자를 고려하는 대신 상호 작용을 계산하기 위해 무작위로 선택되어 효율적인 프로그램을 생성합니다.

  • 00:30:00 이 섹션에서 발표자는 OpenCL 시뮬레이션에서 제한된 수의 입자와의 상호 작용만 계산하기 위한 공간 인덱싱의 사용과 Interop을 사용하여 그래픽 시스템과 데이터 버퍼를 공유하는 것의 중요성에 대해 논의합니다. Interop을 사용하면 GPU 버퍼에서 직접 렌더링할 수 있고 그래픽 메모리의 공간을 절약할 수 있지만, Interop이 없으면 프로그램이 데이터를 호스트 메모리에 복사하고 그 반대로 복사해야 하므로 시뮬레이션 속도가 크게 느려집니다. 발표자는 다른 컨텍스트 생성을 포함하여 Interop을 사용하는 데 필요한 수정 사항을 설명하고 정렬을 위한 입자 인덱스를 포함하여 시뮬레이션에 필요한 버퍼 세트를 소개합니다. Interop의 중요성에 대해 논의했음에도 불구하고 표시되는 프로그램은 Interop을 활용하지 않아 시뮬레이션 속도가 느려집니다.

  • 00:35:00 이 섹션에서 발표자는 Smoothed Particle Hydrodynamics 알고리즘에 사용되는 다양한 커널에 대해 설명합니다. 첫 번째 커널은 입자를 복셀과 연결하는 "해시 입자"입니다. 그런 다음 "정렬" 및 "정렬 포스트 통과" 커널은 입자를 복셀로 정렬하고 공간 인덱스 구성을 위해 구성합니다. 다음으로, "인덱스" 및 "인덱스 포스트 패스" 커널은 복셀에서 입자까지의 공간 인덱스를 구성합니다. 그 후 "좋은 이웃" 커널은 어떤 이웃이 서로 상호 작용할지 결정합니다. 마지막으로 "밀도 압력 계산", "가속 계산" 및 "통합" 커널은 입자 간의 상호 작용 및 물리학을 계산합니다. 발표자는 코드의 GPU 버전에서는 기수 정렬이 사용되고 CPU 버전에서는 Q 정렬이 사용된다고 설명합니다.

  • 00:40:00 이 섹션에서는 SPH(Smoothed Particle Hydrodynamics)에서 복셀에서 입자까지 공간 인덱스를 구성하는 과정을 설명합니다. 커널은 이진 검색을 사용하여 각 복셀에서 가장 낮은 번호의 입자를 식별하고 입자를 포함하지 않는 복셀에는 음수 값을 남깁니다. 그런 다음 인덱스 포스트 패스는 그리드 셀 인덱스에서 비어 있지 않은 다음 복셀의 값을 복사하여 빈 복셀에 대한 인덱스 값을 채웁니다. 인덱싱이 완료되면 프로그램은 각 입자를 둘러싸고 있는 2x2x2 복셀의 로컬 영역을 검색하여 이웃 맵을 구성합니다. 바이어스를 제거하기 위해 프로그램은 각 복셀에 임의의 오프셋을 생성하고 검색 방향을 번갈아 가며 만듭니다. 그런 다음 커널은 상호 작용 반경 내에서 처음 32개 입자를 선택하여 이웃 맵에 추가합니다.

  • 00:45:00 이 섹션에서 연사는 32개의 입자와 상호 작용할 수 있는 이웃 맵을 구성하여 물리학을 계산하는 방법을 설명합니다. 그들은 밀도와 압력을 근사화하는 데 사용되는 방정식을 검토하고 가속도 항을 계산한 다음 모든 것을 결합하여 총 가속도를 결정합니다. 그런 다음 속도와 위치는 입자가 상자를 빠져나가는 것을 방지하기 위한 경계 조건을 갖춘 수치 적분을 통해 진행됩니다. 발표자는 시청자에게 소스 코드를 다운로드하여 재생하도록 권장하고 Navier-Stokes 방정식을 푸는 데 느린 방법이 많이 있지만 느리다고 해서 반드시 좋은 것은 아니라고 강조합니다.

  • 00:50:00 비디오의 이 섹션에서 발표자는 위치를 업데이트하기 전에 속도가 새 위치에 통합되는 시뮬레이션의 업데이트 단계를 설명합니다. 속도 업데이트는 명시적이며 위치 업데이트는 반암시적이며 다음 단계에서 속도 값을 사용합니다. 시뮬레이션은 성능을 위해 부동 상태이지만 높은 충실도와 정확도가 필요한 경우에는 double을 사용하는 것이 좋습니다. 이 알고리즘은 완전히 병렬화 가능하지만 공간 분할의 장단점을 고려해야 합니다. 마지막으로 연사는 다중 GPU와 함께 Interop 사용, 난기류 시뮬레이션, 시뮬레이션의 실제 최대 입자 수에 대한 질문에 답합니다.

  • 00:55:00 이 섹션에서는 연사가 청중의 몇 가지 질문에 답합니다. 시뮬레이션의 실질적인 한계는 사용되는 GPU 및 CPU 등급에 따라 달라지는 성능 속도라고 설명합니다. 그들은 또한 시뮬레이션이 비압축성 방정식을 기반으로 하지만 압축성 동작을 제한할 수 있는 비압축성 조건에 대해 명시적으로 해결하지 않는다고 언급합니다. 발표자는 또한 캐시된 이미지 메모리 대신 버퍼를 사용한 이유에 대한 질문에 답하면서 프로그램을 개발할 당시에는 캐시된 이미지를 사용하여 성능상의 이점을 보지 못했다고 말했습니다. 그러나 그들은 OpenCL이 향후 캐시된 버퍼에 대한 지원을 제공할 것이며 이를 지원하도록 프로그램을 변경할 수도 있다고 언급합니다. 전반적으로 연사는 제한이 없기 때문에 청중이 원하는 방식으로 프로그램을 다운로드하고 사용하도록 초대합니다.
 

AMD Developer Central: OpenCL 프로그래밍 웨비나 시리즈. 8. 최적화 기법: 이미지 컨볼루션



8 - 최적화 기법: 이미지 컨벌루션

이 비디오에서 Udeepta D. Bordoloi는 이미지 컨볼루션의 최적화 기술에 대해 논의합니다.

 

AMD 개발자 내부 트랙: 이미지 컨볼루션을 최적화하는 방법



이미지 컨벌루션을 최적화하는 방법

이 동영상에서는 로컬 데이터 공유 사용, 상수 최적화, 효율성 향상을 위한 더 큰 로컬 영역 사용을 포함하여 이미지 컨벌루션을 최적화하는 다양한 방법에 대해 설명합니다. 연사는 전반적인 성능을 향상시키기 위해 이미지 컨벌루션에서 처리 시간을 최소화하는 것의 중요성을 강조하고 로컬 메모리를 사용하여 데이터를 재사용하는 새로운 방법을 강조합니다. 비디오는 명백한 또는 텍스처 사용, 사고력 사용, 카운터에 전달 옵션 사용과 같은 최적화 단계에 대한 제안을 제공합니다. 이미지 컨볼루션 기술 최적화에 대한 단계별 문서는 개발자 AMD 웹 사이트에서 사용할 수 있습니다.

  • 00:00:00 이 섹션에서는 AMD 그래픽 팀의 Udeepta Bordolo가 출력 이미지 픽셀을 생성하기 위해 입력 이미지 영역에 대해 가중 합계를 수행하는 것과 관련된 이미지 컨벌루션의 개념을 설명합니다. 그는 OpenCL과 5870 GPU를 사용하여 최적화를 수행하고 기본 상관 관계 코드에서 점진적으로 작업합니다. 미러링 및 LDS(Local Data Share) 사용은 사용되는 최적화 방법 중 일부로 실행 시간이 크게 단축됩니다.

  • 00:05:00 이 섹션에서 발표자는 모든 필터 크기와 모든 입력 크기에 대해 작동하는 프로그램에서 이미지 컨벌루션의 최적화에 대해 논의합니다. 그는 데이터 공유를 개선하고 대기 시간을 줄이기 위해 로컬 영역을 사용하는 데 중점을 둡니다. 상수와 입력을 128비트 값으로 해석하면 컴파일러와 지니가 코드를 더 쉽게 해석하고 처리 시간을 줄일 수 있습니다. 그는 상수를 최적화하고 더 큰 로컬 영역을 사용하여 이미지 컨볼루션의 효율성을 크게 향상시킬 수 있는 방법을 보여줍니다. 전반적으로 화자는 전반적인 성능을 향상시키기 위해 이미지 컨볼루션에서 처리 시간을 최소화하는 방법을 찾는 것이 중요하다고 강조합니다.

  • 00:10:00 이 섹션에서 발표자는 필터 크기를 결정하여 이미지 컨볼루션을 최적화하는 방법과 다른 마스크에 대해 필터 크기를 변경하는 방법에 대해 설명합니다. 발표자는 서로 다른 시간에 최적화를 적용하면 성능에 영향을 미칠 수 있지만 예기치 않은 문제를 찾는 데 도움이 될 수 있다고 말합니다. 발표자는 또한 풀 포스 데이터가 포함된 2k x 2k 입력 이미지에 대해 동일한 수의 요소를 실행하여 보다 효율적인 데이터 형식을 생성하는 방법에 대해 논의합니다. 또한 스피커는 하드웨어에서 LDS로 알려진 로컬 메모리를 사용하여 모터를 사용하는 대신 데이터를 재사용하는 새로운 방법을 강조합니다.

  • 00:15:00 이 섹션에서 화자는 이미지 컨볼루션 기술 최적화에 대해 이야기합니다. 그들은 모든 입력을 로드하고 특정 그룹에 의해 지연된 다음 명백한 작업을 수행합니다. 그들은 현금을 알고 있는 그대로 사용하고 텍스처를 사용하기 위해 LDS 사용을 중단합니다. 그들은 2K x 2K 해상도와 다양한 필터 크기로 실험을 수행하고 텍스처를 사용할 때 가장 빠른 숫자를 얻습니다. 그들은 명백한 또는 질감을 사용하고, 사고력을 사용하고, 카운터에 전달 옵션을 사용하는 최적화 단계를 제안합니다. 그들은 또한 가능하면 현금 괴물을 사용하는 것이 좋습니다. 그들은 비디오 옆에 링크된 개발자 AMD 웹 사이트에 이미지 컨볼루션 기술 최적화에 대한 단계별 기사를 게시했습니다.
How to Optimize Image Convolution
How to Optimize Image Convolution
  • 2013.05.28
  • www.youtube.com
Udeepta Bordoloi, MTS Software Engineer in the Stream Computing Group Udeepta Bordoloi walks though several different ways to optimize an image convolution a...
 

AMD Developer Central: OpenCL 기술 개요. OpenCL 소개



AMD Developer Central: OpenCL 기술 개요. OpenCL 소개

이 비디오에서 Michael Houston은 멀티 코어 CPU, 모바일 장치 및 기타 형태의 실리콘을 대상으로 하는 데이터 병렬 계산을 위한 업계 표준인 OpenCL에 대한 개요를 제공합니다. OpenCL은 독립 소프트웨어 공급업체의 개발을 단순화할 CUDA 및 Brook+와 같이 이전에 경쟁했던 독점 구현을 통합하는 것을 목표로 합니다. 장치에서 실행되는 코드와 게임 개발자와의 피드백을 위해 설계된 대기열 시스템을 사용하여 장치를 관리하는 코드 간의 분석을 제공합니다. OpenCL은 그래픽 API와 잘 작동하도록 설계되어 인공 지능 시스템, 모델링 및 물리뿐만 아니라 사진 및 비디오 편집과 같은 다양한 응용 프로그램에 사용할 수 있는 유비쿼터스 컴퓨팅 언어를 생성합니다. 발표자는 또한 헐리우드 렌더링을 위한 OpenCL 사용에 대해 논의하고 이 분야에서 더 많은 작업을 보기를 희망합니다.

  • 00:00:00 이 섹션에서 Mike Houston은 다중 코어 CPU, 모바일 장치 및 기타 형태의 실리콘을 대상으로 데이터 병렬 계산을 위한 산업 표준으로서 OpenCL의 목적을 설명합니다. OpenCL은 독립 소프트웨어 공급업체의 개발을 단순화할 CUDA 및 Brook+와 같이 이전에 경쟁했던 독점 구현을 통합하는 것을 목표로 합니다. OpenCL에는 다른 방언과 약간의 차이가 있지만 CUDA와 같은 다른 데이터 병렬 언어에서 전환하는 것은 직접적이고 빠릅니다. OpenCL은 또한 장치에서 실행되는 코드와 게임 개발자와의 피드백을 위해 설계된 대기열 시스템을 사용하여 장치를 관리하는 코드 간의 분석을 제공합니다. 그래픽 API와 잘 작동하도록 설계되어 사진 및 비디오 편집과 같은 응용 프로그램에서 소비자 공간을 위한 유비쿼터스 컴퓨팅 언어를 생성합니다.

  • 00:05:00 이 섹션에서 발표자는 이미지 또는 고해상도 비디오 처리 및 바이러스 스캐너 실행을 포함하는 OpenCL의 초기 사용 중 일부를 설명합니다. 또한 이 기술은 인공 지능 시스템, 모델링 시스템, 물리, 후처리, 조명 가속 및 영화 렌더링에 유용합니다. 발표자는 무엇보다도 할리우드 렌더링에 OpenCL을 사용하는 작업에 대해 더 많은 작업을 보기를 희망합니다.
Introduction to OpenCL
Introduction to OpenCL
  • 2013.05.29
  • www.youtube.com
Michael Houston, GPG System Architect Learn about OpenCL, what the transition to OpenCL will be like, what applications are ideal for OpenCL and what impact ...
 

AMD Developer Central: 에피소드 1: OpenCL™이란 무엇입니까?



AMD Developer Central: 에피소드 1: OpenCL™이란 무엇입니까?

이 비디오는 다양한 프로세서를 활용하여 순차 계산 대신 병렬 계산을 가속화하는 데 중점을 둔 OpenCL 및 설계 목표에 대한 소개를 제공합니다. OpenCL은 커널, 글로벌 및 로컬 차원, 작업 그룹을 사용하여 다양한 프로세서에 이식 가능한 코드를 작성할 수 있습니다. 작업 항목과 작업 그룹은 리소스를 공유하여 협업할 수 있지만 다른 작업 그룹에 있는 작업 항목 간의 동기화는 불가능합니다. 최적의 문제 차원은 처리 유형에 따라 다르며 최상의 성능을 위해 최상의 차원을 선택하는 것이 중요합니다. OpenCL은 OpenCL 이벤트 모델을 사용하여 작업 및 데이터 병렬성을 함께 표현함으로써 시스템의 기능을 최대한 활용할 수 있습니다.

  • 00:00:00 이 섹션에서 Justin Hensley는 CPU, GPU 또는 셀 광대역 엔진이나 DSP와 같은 기타 프로세서를 활용하여 병렬 계산을 가속화하는 데 주로 초점을 맞추는 OpenCL의 기본 사항과 설계 목표에 대해 설명합니다. 극적인 속도 향상을 가져옵니다. OpenCL은 커널을 사용하여 AMD CPU 및 GPU와 같은 모든 프로세서 유형에서 실행되는 이식 가능한 코드를 작성할 수 있도록 합니다. 커널은 병렬 처리를 활용하는 데 사용되는 C 기능과 유사하며 커널 및 기타 기능의 모음인 프로그램은 다음을 사용하여 커널 인스턴스를 실행하는 응용 프로그램과 함께 사용됩니다. 큐에 대기하고 순서대로 또는 순서 없이 실행되는 대기열. OpenCL의 글로벌 및 로컬 차원은 계산 범위를 정의하는 반면, OpenCL의 전체 요점은 고도의 병렬 장치를 사용하여 동시에 계산을 가속화하는 것입니다. 글로벌 작업 항목은 동기화만 가능하고 독립적이어야 하기 때문에 로컬 작업 그룹이 리소스를 공유하여 협업할 수 있습니다. 작업 그룹 내에서.

  • 00:05:00 이 섹션에서는 작업 항목 및 작업 그룹에 대해 알아보고 OpenCL을 통해 장벽 또는 메모리 펜스를 사용하여 작업 그룹 내의 작업 항목 간에 동기화하는 방법을 알아봅니다. 그러나 다른 작업 그룹의 작업 항목은 서로 동기화할 수 없습니다. 최적의 문제 차원은 처리 유형에 따라 다르며 최상의 성능을 얻으려면 주어진 문제에 가장 적합한 차원을 선택하는 것이 중요합니다. OpenCL에서는 OpenCL 이벤트 모델을 사용하여 단일 작업 항목을 작업으로 실행하여 작업 병렬성을 표현할 수도 있습니다. 작업 및 데이터 병렬 처리가 함께 작동하도록 허용함으로써 OpenCL은 시스템의 기능을 완전히 활용할 수 있습니다.
Episode 1: What is OpenCL™?
Episode 1: What is OpenCL™?
  • 2013.05.27
  • www.youtube.com
In this video, you learn what OpenCL™ is and why it was designed the way itis. We go through design goals and the execution model of OpenCL™. Topicscovered i...