OpenCL 병렬 계산 3 - 호스트 프로그래밍 데이터 전송 및 구분

3668 단어 병렬 계산
장치가 호스트가 전달한 작업을 수행하려면 최소한 세 부분이 필요하다. 실행된 작업의 명령, 데이터를 저장하는 캐시, 결과가 되돌아오는 것이다.

호스트와 장치 간의 데이터 전송:


1. 커널 파라미터 설정


우리는 커널을 명령 대기열을 통해 장치에 전달할 것이다. 단지 카드를 유저에게 주었을 뿐이다.우리는 반드시 내부 핵에 파라미터를 전달해야만 설비가 내부 핵을 집행할 수 있다.캐시 대상의 주요 역할은 호스트와 설비 간에 데이터를 전달하는 교량이다.우리는 기본 데이터 형식 지침, 메모리 대상 지침, 샘플링 대상 지침 세 가지 형식의 내부 핵 파라미터를 설정할 수 있다.일반적인 상황에서 우리가 만든 메모리 대상은 모두 버퍼 대상입니다. 데이터에 픽셀 데이터가 포함되지 않으면 이미지 대상을 만들어야 합니다. 캐시 대상과 이미지 대상의 데이터 구조는cl 입니다.mem.캐시 개체를 생성할 때 매개변수 설명: clCreateBuffer(cl context context, cl mem flags options, size t size, void *host ptr, cl int *error)clmem_flags: 이 매개 변수는 일반적으로 몇 개의 매개 변수의 조합으로 다음과 같다.CL_MEM_READ_WRITE: 장치 읽기 및 쓰기 허용 CLMEM_WRITE_ONLY: 디바이스만 쓸 수 있고 디바이스는 메모리를 할당하며 호스트는 할당할 수 없습니다.CL_MEM_READ_ONLY: 장치에서만 CL 읽기 가능MEM_USE_HOST_PTR: 호스트의 메모리를 공유하지만 데이터에 보안이 없습니다.CL_MEM_COPY_HOST_PTR:copy 호스트에서 전송되는 데이터 CLMEM_ALLOC_HOST_PTR: 잘 모르겠어요.요약: 장치에 호스트 데이터를 전달하는 경우: CLMEM_READ_WRITE |CL_MEM_COPY_HOST_PTR 장치가 계산 결과를 호스트에 반환하는 경우: CLMEM_WRITE_ONLY 캐시 대상은 주로 장치에 사용하기 위한 것으로 그 본질은 device memory이다.커널 함수에 대한 매개 변수 설정을 통해 이러한 대상을 장치에 보낼 수도 있지만 호스트와 장치 간의 데이터 전송 명령을 통해 전달할 수도 있다.

2. 메모리 개체에 대한 전송 명령


호스트가 명령을 명령 대기열에 보내는 과정을 입열이라고 하는데 명령은 사실 함수이다.입열 데이터 전송 명령은 세 가지로 나눌 수 있는데 그것이 바로 읽기/쓰기 데이터 전송을 시작하는 함수, 메모리를 비추고 비추는 함수, 그리고 서로 다른 메모리 대상 사이에서 데이터를 복제하는 함수이다.이 함수들은 새로운 메모리 대상을 만들지 않았습니다. 접근한 데이터가 있는 메모리 대상은 핵 함수를 통해 장치에 전달되었습니다.a) 읽기/쓰기 데이터 전송은 주로 호스트 메모리와 장치 메모리 사이의 데이터 전송을 완성한다.b) 메모리 매핑 객체는 디바이스의 메모리를 호스트에 매핑하여 나중에 호스트에서 메모리를 읽고 수정할 수 있도록 합니다.메모리 매핑의 운행 성능은 일반적인 읽기/쓰기 함수보다 훨씬 높다.c) 메모리 대상 간의 데이터 복제는 상기 호스트 메모리와 메모리 대상 간의 데이터 전송과 달리 이런 방식은 메모리 대상 간의 데이터 복제인데 이 조작은 주로 장치에서 발생한다.

단일 장치(GPU)의 데이터 및 컴퓨팅 작업 할당:


단일 장치에서 데이터를 구분하는 함수는 단 하나입니다: clEnqueue NDRange Kernel. 장치의 서로 다른 처리 자원 간에 핵을 분배하고 실행할 수 있습니다.GPU의 장점은 계산을 하는 데 있다. CPU의 장점은 프로세스 제어를 하는 데 있다. 우리는 내부 핵을 GPU에 운행하기 때문에 GPU에서 가장 안쪽의 교체만 운행할 수 있다. 이번 교체 과정을 작업 항목(Work-item)이라고 부른다.내부 핵과 작업 항목의 차이: 내부 핵은 일련의 데이터 처리 임무의 집합을 나타내고 작업 항목은 특정한 데이터 집합을 대상으로 하는 내부 핵을 실현한다.예를 들면 다음과 같습니다.
for(i=is;ii++)
    for(j=js;jj++)
        for(k=ks;k[i][j][k]);

work_dims: 데이터 차원 = 전역 id의 원소 수량 = 수조의 차원 = 3;global_work_offset: 각 차원에서 전역 ID의 편이도 = {is, js, ks} 글로벌work_sizes: 각 차원에서 처리할 작업 항목의 수량을 나타낸다. 일반적으로 각 순환에서 순환하는 횟수={ie,je,ke}localwork_size: 각 차원에서 하나의 작업 그룹의 작업 항목의 수량입니다.하나의 작업 항목 = 가장 깊은 단계의 교체 =process(a[i][j][k]);
작업 그룹: 같은 처리 자원에 접근하는 작업 항목으로 구성됩니다.그룹의 각 작업 항목은 고속 메모리 (국부 메모리) 의 같은 메모리에 접근할 수 있습니다.그룹의 작업 항목은 울타리 (fence) 와 장애 (barrier) 를 통해 동기화할 수 있습니다.임대료를 지원할 수 있는 처리 자원을 처리 단원이라고 부른다.

요약: OpenCL 데이터 처리 및 할당


장치와 호스트 사이의 데이터 전송 캐리어는clmem 구조.메모리 대상의 전송 과정: a) 존재하는 데이터를 통해 메모리 대상을 만든다.b) clSetKernelArg을 호출하여 이 메모리 객체를 커널의 매개변수로 설정합니다.이렇게 하면 내부 핵은 실행 과정에서 메모리 대상을 매개 변수로 삼아 접근할 수 있다.메모리 대상은 캐시 대상과 이미지 대상으로 나뉜다.캐시 대상은 1차원 형식으로 일반 데이터를 저장하고 이미지 대상은 2차원 또는 3차원 방식으로 데이터를 저장한다.OpenCL은 호스트와 장치 간의 데이터 통신을 위한 입열 함수와 메모리 매핑 방식을 제공합니다.데이터 분할은 고성능 OpenCL 응용 프로그램을 진행하는 데 있어서 피할 수 없는 화제다.분할 작업의 기본 단원은 작업 항목이고 대응하는 것은 순환 중의 가장 깊은 차원의 교체이다. 모든 작업 항목은 전역 ID를 가지고 코드가 접근하는 데이터 위치를 표시한다.만약 작업 항목 간에 동기화 처리가 필요하다면, 이 작업 항목에 대해 작업 그룹을 구분해야 하며, 각 작업 그룹은 장치에 해당하는 계산 단원에 분배되어 실행될 것이다.

좋은 웹페이지 즐겨찾기