GPU에서 계산되는 데 도움이되는 가장 사소한 기능은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2443402

  •  19-09-2019
  •  | 
  •  

문제

나는 방금 OpenCL을 배우기 시작했습니다. 기능/알고리즘을 GPU로 이동할 때 성능이 어떤 성능을 얻을 수 있는지에 대한 느낌을 얻으려고 노력하고 있습니다.

대부분의 자습서에서 제공되는 가장 기본적인 커널은 두 개의 배열 숫자를 취하고 해당 인덱스에서 값을 합산하여 다음과 같은 세 번째 배열에 추가하는 커널입니다.

__kernel void 
add(__global float *a,
    __global float *b,
    __global float *answer)
{
    int gid = get_global_id(0);
    answer[gid] = a[gid] + b[gid];
}

__kernel void
sub(__global float* n,
    __global float* answer)
{
    int gid = get_global_id(0);
    answer[gid] = n[gid] - 2;
}

__kernel void
ranksort(__global const float *a,
         __global float *answer)
{
  int gid = get_global_id(0);
  int gSize = get_global_size(0);
  int x = 0;
  for(int i = 0; i < gSize; i++){
    if(a[gid] > a[i]) x++;
  }
  answer[x] = a[gid];
}

나는 당신이 GPU에서 이것을 컴퓨팅하는 것을 결코 정당화 할 수 없다고 가정합니다. 메모리 전송은 CPU에서 이것을 크기로 계산하는 데 걸리는 시간에 가중치를 줄 것입니다 (이에 대해 잘못 될 수 있으므로이 질문).

내가 궁금한 점은 CPU 대신 OpenCL 커널을 사용할 때 상당한 속도를 기대할 수있는 가장 사소한 예가 무엇입니까?

도움이 되었습니까?

해결책

충분히 큰 행렬 세트를 가지고 있다면 선형 대수 연산을 수행하거나 각 요소에서 동일한 작업을 수행하는 것이 사소한 예로 생각합니다. 매트릭스 곱셈, 추가, FFT, Convolution 등. 많은 작업을 수행하지 않고 약간의 속도가 나옵니다. 이제 100x 속도 업을보고 싶다면 메모리 관리를 탐구하고 무대 뒤에서 무슨 일이 일어나고 있는지에 대해 약간 알아야합니다.

시작하기 위해서는 Pycuda로 시작하는 것이 좋습니다. 매우 높은 수준의 추상화를 제공하고 매우 빨리 뛰어 들어갈 수 있기 때문에 시작하는 것이 매우 간단하기 때문입니다. 일리노이 대학교에서 CUDA를 사용하여 병렬 컴퓨팅에 대한이 과정을 확인하십시오. http://courses.ece.illinois.edu/ece498/al/ 더 나아갈 준비가되면.

다른 팁

사소한 정의에 따라 다릅니다. 내 생각에 그것은 매트릭스 매트릭스 제품이 될 것입니다. O(3)/O(2) 메모리 대 계산 비율. 유사한 비율을 나타내는 알고리즘은 GPU에서 경쟁하는 이점이 있습니다.

커널은 분명히 사소한 것이지만 유용한 예일 수 있습니다. 두 개의 읽기와 1 개의 쓰기가 있고 하나의 산술 작동이있는 모든 요소에 대해 완전히 메모리 바운드입니다. 주소 등을 계산하기위한 몇 가지 지침이 있지만,이 모든 것은 메모리에 액세스하는 데 드는 비용과 비교할 때 실제로 아무것도하지 않습니다.

데이터가 이미 GPU에 있다고 가정하면이 간단한 커널에 대해서도 GPU의 매우 높은 대역폭으로부터 메모리에 대한 이점을 얻을 수 있습니다.

물론 GPU는 메모리 대기 시간을 숨기기에 충분한 스레드를 갖는 데 의존하므로 로컬 작업 그룹 크기는 상당히 커야합니다 (예 : 256 또는 512). 효과적이지만 그것은 일종의 요점입니다!

나는 질문이 상당히 오래되었음을 알고 있지만 ... Mandelbrot 세트의 계산은 GPU에 매우 최적이라는 것을 알았습니다. 복잡한 입력 벡터 (Float2)와 스칼라 출력 (int)이 있으며 입력 벡터 당 평균적으로 수백 개의 작업이 있습니다.

좋은 예제 응용 프로그램으로 사용될 수 있습니다.

  • 2 차원 입력 데이터 세트가 있습니다 (이미지 계산)
  • 웨이브 프론트와 2 차원 처리가 유익한 이유를 설명 할 수 있습니다.
  • 벡터 데이터 유형을 보여줍니다
  • 인간의 눈으로 빠르게 검증 할 수있는 그림을 제작합니다 (디버깅)
  • Color Mapping (__Constant), Float2 대신 Float4 처리 (최적화), INT4 (R, G, B, A) 출력 벡터 (최적화)를 쉽게 확장 할 수 있습니다. 감소 단계 (RGBA) => (RGB)
  • 필요한 수학 지식이 허용됩니다 (간단한 공식)

안부, 스테판

매트릭스 곱셈 후에는 이미지 컨볼 루션 (예 : 흐림, 노이즈 등)을 말할 것입니다. 체크 아웃 AMD의 튜토리얼.

"가장 사소한"것은 의견의 문제이지만, Mandelbrot 세트의 이미지를 계산하는 것은 GPU를 사용하는 매우 간단한 응용 프로그램이라고 말합니다. 각 지점은 다른 모든 지점과 완전히 독립적이므로 각 지점마다 스레드를 시작하고 엄청난 속도를 높일 수 있습니다. 반복되는 공식 자체는 간단한 2 차 기능입니다. 내 블로그에서 찾을 수있는 튜토리얼에서 예제로 사용했습니다. 여기, 이미지를 만들지 않고도 숫자를 계산하여 더 간단하게 만들 수 있습니다. 거의 모든 부끄러운 평행 (Wikipedia 항목 참조) 문제는 처음부터 좋은 문제입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top