GPU가 CPU보다 빠른 통계 방법은 무엇입니까?


18

방금 데스크탑에 Nvidia GT660 그래픽 카드를 설치했으며, 어려움을 겪은 후 R과 인터페이스 할 수 있습니다.

GPU, 특히 gputools를 사용하는 여러 R 패키지를 가지고 놀았으며 GPU와 CPU에서 몇 가지 기본 작업을 수행하는 데 걸리는 시간을 비교했습니다.

  • 인 버팅 매트릭스 (CPU 더 빠름)
  • qr 분해 (CPU 더 빠름)
  • 큰 상관 행렬 (CPU 더 빠름)
  • 행렬 곱셈 (GPU가 훨씬 빠름)

내가 gputools를 주로 실험 했으므로 다른 패키지가 더 잘 수행 될 수 있습니다.

넓은 의미에서 내 질문은 : CPU가 아닌 GPU에서 실행할 가치가있는 일상적인 통계 작업은 무엇입니까?


1
행렬 곱셈과 관련된 것이 있습니까? :) GPU는 신경망 커뮤니티에서 매우 인기가 있습니다.

관련된 행렬의 크기를 제공해야합니다. 예를 들어, 지난 2 년 전에
필자가

1
반전, qr 및 행렬 곱셈 에 약 행렬을 사용했지만 상관 관계에 대해서는 크기가 100 인 벡터의 약 10 ^ 4 관측 값을 사용했습니다. 행렬 반전의 경우 GPU가 훨씬 느리지 만 qr 분해의 경우 속도는 느리지 만 CPU와 비슷합니다. 10×10
Jugurtha

2
이것은 아주 좋은 질문입니다하지만 난 당신이 유래로 마이그레이션함으로써 더 나은 답변을 얻을 수있을 거라 생각 (내가 비슷한 질문이 있었다 생각을하기 전에이 질문)
user189035

2
일반 CPU의 GPU의 장점은 코어 당 속도가 빠르지 않고 "대량"병렬 처리가 가능하다는 사실입니다. 따라서 Cholesky 인수 분해 등과 같이 "하우스 키핑"이 많이 필요한 작업의 경우 상당한 속도 향상을 위해 블록 알고리즘 등을 사용해야합니다. 이것은 사소한 것이 아니며 GPU가 그러한 작업을 인계하기까지 시간이 걸릴 것으로 가정합니다. GPU 방식은 확실히 MCMC-ing (및 난수 생성)입니다. 후부의 샘플링에는 "병렬화"가 쓰여져 있습니다. 그리고 희소 행렬 계산; 그들은 "차단"이미 어쨌든 ...
usεr11852는 분석 재개 MONIC 말한다

답변:


6

GPU는 민감한 짐승입니다. 엔비디아의 beefiest 카드는 이론적으로 더 빨리 가장 빠른 CPU보다 100 배 나열된 조작을 실행할 수 있지만, 가지가 그 속도 향상의 방법으로 얻을 수 있습니다. 이론상 최대 속도에 근접 할 수 있도록 관련 알고리즘 및이를 실행하는 프로그램의 모든 부분을 광범위하게 조정하고 최적화해야합니다. R은 일반적으로 빠른 언어로 알려져 있지 않으므로 기본 GPU 구현이 최소한 원시 성능 측면에서 그리 훌륭하지 않다는 사실은 놀랍지 않습니다. 그러나 R GPU 기능에는 누락 된 성능 중 일부를 회복하기 위해 조정할 수있는 최적화 설정이있을 수 있습니다.

실행해야하는 일부 계산이 완료하는 데 몇 주 / 개월이 걸리는 것으로 GPU를 조사하고 있다면 R에서보다 성능이 좋은 언어로 마이그레이션하는 것이 좋습니다. 파이썬은 R보다 작업하기가 너무 어렵지 않습니다. NumPy 및 SciPy 패키지는 R과 동일한 통계 기능을 가지고 있으며 PyCuda를 사용하여 자체 GPU 기반 함수를 매우 간단하게 구현할 수 있습니다.

GPU에서 함수가 실행되는 속도 를 실제로 높이려면 C ++과 CUDA의 조합으로 자체 함수를 구현하는 것이 좋습니다. CUBLAS 라이브러리는 모든 선형 대수 관련 무거운 리프팅을 처리하는 데 사용할 수 있습니다. 그러나 이러한 코드를 작성하는 데 시간이 오래 걸릴 수 있음을 명심하십시오 (특히 처음 작성하는 경우).이 방법은 실행하는 데 시간이 오래 걸리는 계산 (월) 및 또는 수백 번 반복 될 것입니다.


6

넓은 의미에서 GPU에서 더 빠르게 실행되는 알고리즘은 여러 데이터 포인트에서 동일한 유형의 명령을 수행하는 알고리즘입니다.

이것을 설명하는 쉬운 예는 행렬 곱셈입니다.

우리가 행렬 계산을하고 있다고 가정하자

×=

간단한 CPU 알고리즘은 다음과 같습니다

// C = 0으로 시작

for (int i = 0; i < C_Width; i++)
{
    for (int j = 0; j < C_Height; j++)
    {
        for (int k = 0; k < A_Width; k++)
        {
            for (int l = 0; l < B_Height; l++)
            {
                C[j, i] += A[j, k] * B[l, i];
            }
        }
    }
}

여기서 중요한 것은 중첩 된 for 루프가 많고 각 단계가 하나씩 실행되어야한다는 것입니다.

이것의 도표를보십시오

C의 각 요소의 계산은 다른 요소에 의존하지 않습니다. 따라서 계산 순서는 중요하지 않습니다.

따라서 GPU에서 이러한 작업을 동시에 수행 할 수 있습니다.

행렬 곱셈을 계산하기위한 GPU 커널은 다음과 같습니다.

__kernel void Multiply
(
    __global float * A,
    __global float * B,
    __global float * C
)
{
     const int x = get_global_id(0);
     const int y = get_global_id(1);
     for (int k = 0; k < A_Width; k++)
     {
         for (int l = 0; l < B_Height; l++)
         {
             C[x, y] += A[x, k] * B[l, y];
         }
     }
}

이 커널에는 두 개의 내부 for 루프 만 있습니다. 이 작업을 GPU로 전송하는 프로그램은 C에서 각 데이터 포인트에 대해이 커널을 실행하도록 GPU에 지시합니다. GPU는 여러 스레드에서 동시에 이러한 명령을 각각 수행합니다. 예전처럼 "수십 개의 저렴한"GPU는 동일한 작업을 여러 번 빠르게 수행하도록 설계되었습니다.

그러나 GPU 속도를 늦추는 알고리즘이 있습니다. 일부는 GPU에 적합하지 않습니다.

예를 들어, 데이터 의존성이 있었다면, 즉 C의 각 요소의 계산이 이전 요소에 의존한다고 상상해보십시오. 프로그래머는 이전의 각 계산이 끝날 때까지 커널에 장벽을 두어야합니다. 이것은 주요 속도 저하입니다.

또한 많은 분기 논리를 갖는 알고리즘은 다음과 같습니다.

__kernel Foo()
{
    if (somecondition)
    {
        do something
    }
    else
    {
        do something completely different
    }
}

GPU가 더 이상 각 스레드에서 동일한 작업을 수행하지 않기 때문에 GPU에서 느리게 실행되는 경향이 있습니다.

고려해야 할 다른 많은 요소가 있기 때문에 이것은 간단한 설명입니다. 예를 들어, CPU와 GPU간에 데이터를 보내는 것도 시간이 많이 걸립니다. 때로는 여분의 전송 시간을 피하기 위해 CPU에서 더 빠를 때에도 GPU에서 계산을 수행하는 것이 좋습니다 (그 반대의 경우도 마찬가지).

또한 많은 최신 CPU가 하이퍼 스레드 멀티 코어 프로세서와 함께 동시성을 지원합니다.

GPU는 재귀에 좋지 않은 것 같습니다 . QR 알고리즘의 일부 문제를 설명하는 여기 를 참조 하십시오 . 하나는 재귀 데이터 종속성이 있다고 생각합니다.


2
공식적으로 SX-naughty는 그것이 훌륭한 답변이라고 말하는 답변에 대해 언급하는 것이지만, 나는 부정에 대한 쥐의 개요를 제공하지 않습니다 : 이것은 즐겁고 유익한 답변입니다. SX의 큰 불의 중 하나는 '오래된'(인터넷 시간) 질문에 대해 정교하게 정보를 제공하는 사람들에게 칭찬이 부족하다는 것입니다. (또한, 나는 '오래된'(인터넷 시간) 답변에 엄지 손가락을 싣고 있습니다.
GT.

중요한 고려 사항은 실제로 계산을 수행 할 라이브러리가 있는지 여부입니다. 예를 들어, 필자의 지식으로는 R 패키지가 아닌 행렬 곱셈의 희박한 x 밀도 GPU 구현이 없습니다. GPU C 코드 작성 작업을 준비한 경우 행운을 빕니다.
Jack Wasey

4

=210,미디엄210,케이214

더 광범위하게, 대부분의 시간을 고밀도 선형 대수 (BLAS, Lapack 기능)에서 소비하는 대부분의 통계 연산이 GPU에서 효율적으로 구현 될 수 있다고 생각합니다.


0

누락 된 데이터에 대한 여러 대치 방법? Alice-II (R)와 같습니다.

나는 그것들이 종종 부끄럽게 평행하기 때문에 GPU 아키텍처에 적합하다고 생각합니다. 그래도 직접 시도하지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.