GPUはCPUよりも高速な統計手法はどれですか?


17

私はデスクトップにNvidia GT660グラフィックカードをインストールしましたが、苦労してRとのインターフェイスを管理しました。

GPU、特にgputoolsを使用するいくつかのRパッケージで遊んでおり、GPUとCPUが基本的な操作を実行するのにかかる時間を比較していました。

  • 行列の反転(CPU高速)
  • qr分解(CPU高速)
  • 大きな相関行列(CPU高速)
  • 行列乗算(GPUがはるかに高速!)

私は主にgputoolsで実験しているので、他のパッケージの方がパフォーマンスが良いかもしれません。

大まかに言うと、私の質問は次のとおりです。CPUではなくGPUで実行する価値のある日常的な統計演算は何ですか?


1
多数の行列乗算を伴うものはありますか?:) GPUは、ニューラルネットコミュニティで非常に人気があります。

関連する行列のサイズを指定する必要があります。たとえば、最後にチェックした(確かに2年前)反転と分解は、大きな行列から始まるGPUでのみ高速でした(2 ^ 9×2 ^ 9以上)
user189035

1
反転、qr、および行列乗算には約行列を使用し、相関にはサイズ100のベクトルの約10 ^ 4の観測値を使用しました。行列反転ではGPUははるかに遅く、一方qr分解は遅くなりましたが、CPUに匹敵しました。103×103
ジュグルタ

2
これは非常に良い質問ですが、stackoverflowに移行することでより良い答えが得られると思います(以前同様の質問があったと思います)
user189035

2
通常のCPUのGPUの利点は、コアごとに高速になるのではなく、「大規模に」並列化できるという事実です。そのため、コレスキー分解などの多くの「ハウスキーピング」を必要とするジョブの場合、ブロックアルゴリズムなどを使用して大幅に高速化する必要があります。これは簡単なことではなく、GPUがそのような操作を引き継ぐまでに時間がかかると思います。間違いなくGPUの道を進んでいるのは、MCMC-ing(および乱数生成)です。事後からのサンプリングには、全体にわたって「並列化」が記述されています...そして、スパース行列の計算。彼らは「ブロック」すでにとにかく...
usεr11852は回復モニック言う

回答:


6

GPUは繊細な獣です。Nvidiaのbeefiestカードは、理論的にはあなたが速い最速のCPUよりも100倍を記載されているのいずれかの操作を実行することができますが、およそ百万 の事はその高速化の方法で取得することができます。関連するアルゴリズムのすべての部分、およびそれを実行するプログラムのすべての部分を大幅に調整し、最適化して、理論上の最大速度に近づきます。Rは一般に特に高速な言語であることは知られていないため、デフォルトのGPU実装が少なくとも生のパフォーマンスの点でそれほど優れていないことは驚くことではありません。ただし、R GPU関数には最適化設定があり、その不足しているパフォーマンスの一部を回復するために微調整できます。

実行する必要のある計算が完了するまでに数週間/数か月かかることがわかっているためにGPUを検討している場合、Rからよりパフォーマンスに優しい言語に移行するのに時間をかける価値があるかもしれません。PythonはRよりも難しくありません。NumPyおよびSciPyパッケージには、Rとほとんど同じstat関数があります。PyCudaを使用して、GPUベースの関数をかなり簡単に実装できます。

関数をGPUで実行する速度を本当に向上させたい場合は、C ++とCUDAの組み合わせで独自の関数を実装することを検討します。CUBLASライブラリを使用して、線形代数に関連するすべての重量物を処理できます。ただし、そのようなコードを書くのにはかなり時間がかかる可能性があることに注意してください(特に初めて行う場合) /または、何百回も繰り返すことになります。


6

大まかに言えば、GPU上でより高速に実行されるアルゴリズムは、多くの異なるデータポイントで同じタイプの命令を実行するアルゴリズムです。

これを説明する簡単な例は、行列の乗算です。

行列計算をしていると仮定します

A×B=C

単純な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];
         }
     }
}

このカーネルには、内部ループが2つしかありません。このジョブをGPUに送信するプログラムは、Cの各データポイントに対してこのカーネルを実行するようにGPUに指示します。GPUは、これらの各命令を多数のスレッドで同時に実行します。昔の格言「Cheaper by theダース」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-いたずらですが、私はネズミについてネズミの会談をしません:これは楽しく有益な答えです。SXの大きな不正の1つは、「古い」(インターネット時間内の)質問に対して非常に有益な回答をする人々に対する称賛の欠如です。(さらに、私は「古い」(インターネット時間内)の答えに賛成です:知っていますよね?META)。
GT。

重要な考慮事項は、実際に計算を行うライブラリがあるかどうかです。たとえば、私の知る限り、行列乗算のスパースx高密度GPU実装はなく、Rパッケージを介したものではありません。GPU Cコードの作成に取り組む準備ができている場合は、幸運を祈ります。
ジャックワシー

4

n=210nm210k214

もっと広く言えば、ほとんどの時間を高密度線形代数(BLAS、Lapack機能)に費やすほとんどの統計演算は、GPUで効率的に実装できると思います。


0

欠損データに対する複数の代入方法?Alice-II(R)のものと同様。

私はそれらはしばしば恥ずかしいほど並列である傾向があり、したがってGPUアーキテクチャに適していると思います。自分で試したことはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.