質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C++

    4444questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    1517questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

  • アセンブリ言語

    116questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

  • CUDA

    111questions

    CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

  • CPU

    52questions

GPUと並列処理を行うCPUでの処理速度について。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,816

carnage0216

score 122

好奇心ゆえの質問なので怒られてしまうかもしれませんが答えて頂けるとありがたいです。

gpuと並列処理を行うcpuの処理速度は画像処理と機械学習においてどちらが速いですか?
gpuはc/c++でプログラムが書いてありcpuはc/c++とアセンブリ言語または、全てアセンブリ言語で書いてあるとします。

また、仮にcpuの処理速度が遅い場合、cpuはgpuのように画像処理の物体検出は滑らかにできるでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • carnage0216

    2018/04/02 16:19

    情報が少なすぎました。改めて編集いたします。

    キャンセル

  • YomogiKOBO

    2018/04/02 16:41

    顔認証速度の記載があったけど、計測環境は閲覧者で自作しろってことですか?

    キャンセル

  • 退会済みユーザー

    2018/04/02 17:03

    複数のユーザーから「問題・課題が含まれていない質問」という意見がありました
    teratailでは、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。
    「編集」ボタンから編集を行い、質問の意図や解決したい課題を明確に記述していただくと回答が得られやすくなります。

回答 3

checkベストアンサー

+3

こんにちは。

gpuと並列処理を行うcpuの処理速度は画像処理と機械学習においてどちらが速いですか?

両方とも使うのがベストです。GPUは原理的に多量の単純処理が得意でしょう。CPUはGPUより複雑な処理を担えます。
ですので、基本的にはCPUで処理し、その内GPUに任せた方が高速化できるだろう処理をGPUに任せるのが妥当です。
つまり、もしも、GPUに任せた結果、全体の処理性能が落ちたなら、それは単なる設計ミスです。
従って、ご提示のような比較は意味がありません。

具体的にどんな処理ならGPUに任せた方が全体の性能が上がるのか?については、ごめんなさい。私はGPUへ処理分割した経験がないため、把握していません。
しかし、特定の処理について「GPU化することで高速化に成功した」のような報告は、恐らく学術論文で発表されるようなレベルだろうと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/02 13:54

    貴重なご意見どうもありがとうございます。
    情報系の大学の論文を探してみます。

    キャンセル

  • 2018/04/02 16:29

    >しかし、特定の処理について「GPU化することで高速化に成功した」のような報告は、恐らく学術論文で発表されるようなレベルだろうと思います。

     NvidiaのGDCの発表を見ましょう。革ジャンのNvidiaの社長自らそういった例をガンガン説明してくれます。見ていて楽しいです。

    キャンセル

  • 2018/04/02 16:31

    どうもありがとうございます。ようつべで探してみます。

    キャンセル

  • 2018/04/02 19:03

    なんで本家NVIDIAを先に見に行かないんだ...
    https://developer.nvidia.com/

    キャンセル

  • 2018/04/06 13:57

    ちなみにGPUを使いこなすにもCPUのマルチプロセスを実装したりアルゴリズムや原理を学ぶことは役に立つと思うのですが、Chironianさんはどう思いますでしょうか?

    キャンセル

  • 2018/04/06 13:58

    役に立つならばラズパイ3bで実装したり勉強したいと思います。C/C++の勉強も踏まえて。

    キャンセル

  • 2018/04/06 14:02

    GPUとCPUのマルチスレッドはそのからくりがぜーんぜん違うんスよー。

    キャンセル

  • 2018/04/06 14:04

    では、CPUの並列処理のアルゴリズムを勉強しても意味が無そうです。

    キャンセル

  • 2018/04/06 14:17

    面白い記事を見つけたので載せます。
    http://d.hatena.ne.jp/kei_kei/20091101/1257092364

    あくまで仮設なので個人的にはCPUを並列化してもGPUに勝ち目はないように思えます。

    キャンセル

  • 2018/04/06 16:35

    carnage0216さん

    > ちなみにGPUを使いこなすにもCPUのマルチプロセスを実装したりアルゴリズムや原理を学ぶことは役に立つと思うのですが
    まずは普通にシングル・スレッド、次にマルチスレッド、そしてマルチコア(GPU)のステップを踏まないと厳しいかも知れませんね。そして、GPUはキャッシュやバス・アービトレーション云々のようなかなりハードウェアに近い部分の学習も必要になると思います。上から下まで全部カバーできる人って天才だろうと思います。そうでない人が手を出すと、全て中途半端で役に立たない人に成り下がる可能性を懸念します。

    > 個人的にはCPUを並列化してもGPUに勝ち目はないように思えます。
    回答にも書きましたように、ある意味当たり前ですが、CPUよりGPUの方が得意な処理は存在します(そうでなければそもそもGPUの存在意義がない)。
    ですので、そのような処理はGPUに任せると性能は改善する筈ですよ。
    そして、GPUに任せると効率が劣化するような処理をGPUに任せたら、やはり当たり前ですが性能は劣化します。
    議論するまでもないと思います。適材適所はいつでも大事です。

    議論するなら「どんな処理をGPUに任せたほうが良いのか?」などでしょう。
    回答にも記載した通り、私はその議論には参加できませんが。

    キャンセル

  • 2018/04/06 16:50

    >>シングル・スレッド、次にマルチスレッド、そしてマルチコア(GPU)のステップを踏まないと厳しいかも知れませんね。
    天才云々より努力します。
    アドバイスありがとうございます。

    キャンセル

  • 2018/04/06 16:52

    >>GPUはキャッシュやバス・アービトレーション云々のようなかなりハードウェアに近い部分の学習も必要になると思います
    楽しそうで、勉強するのが楽しみです。
    ちなみに、上から下とはソフトからハードという意味ですか?

    キャンセル

  • 2018/04/06 17:15

    その通りです。GPUの性能をバリバリ引き出せ、かつ、アプリをバリバリ作れるような人は天才と思います。

    キャンセル

  • 2018/04/06 17:49

    スティーブウォズニアックのような天才ですね。

    キャンセル

  • 2018/04/06 19:17

    ⅭとC++の基礎を勉強した後でOPENCVなどいずれ解読したいと考えているのですが、OPENCVの関数の構造を理解して(OSに触れない程度に)どの関数とつながっているのかなどを細かく調べていき標準関数
    (ⅭとC++の基礎に出てきた関数)が見えてくるまで掘り下げるのでしょうか?
    標準関数がどのように働いて画像処理など行っているかなど深く理解したいと考えています。

    キャンセル

+3

もう解決済みですが。

GPUとCPUの処理速度を議論するには、3点について理解している必要があります。

  1. GPUとは何か
  2. IO律速と演算律速
  3. 並列計算について

  1. まずGPUをCPUと比較した場合ですが、GPUは大量に演算コアのある計算装置です。
    CPUでは一般向けだと最近では6~8コアなども出ていますが、その程度のコアの数です。
    これに対して、例えばコンシューマ向けで最高ランクまで行くとGTX1080Tiでは3584コア持っています。
    これだけ演算を並列に行うことによってCPUよりも大幅にflopsを向上させることができます。
    その差はこちらのwikipediaでご覧にいただけますが、
    https://ja.wikipedia.org/wiki/FLOPS
    GPUは、最高性能のCPUに対して2倍以上、普段使いのCPUに対して10倍ほどの性能が出ます(理論値)。
    演算するコアが多いことがGPUの強みです。

  2. それで次に考えねばならないのが行いたい計算がIO律速か演算律速かです。
    なぜならGPUが速いのはコアがたくさんあって演算が速いのです。
    これに対して、IO律速のプログラムを実行しても、速度の向上は全く期待できません。
    GPUが有利なのは演算律速の場合です。
    http://www.r-ccs.riken.jp/aicssite/wp-content/uploads/2017/05/tokuronA_17_5_katagiri.pdf
    ※一応IOというのはInput/Outputの略でデータの読み込み書き込みのことです。

  3. これとは別に並列計算の実行可能性についても十分考慮しなければなりません。
    よくある例えは次のようなものです。
    7分でオムレツを考えた場合、100個のオムレツを作るのにかかる時間はいくらかというものです。
    100個のフライパンとコンロを用意すれば7分で出来上がります。
    これが理想的な並列化です。
    これに対して7分で作られるべきオムレツを作るのに7個のフライパンとコンロを用意しても1分で出来上がるわけではありません。
    このような並列不可能な部分も存在します。
    GPUで高速化できるのは前者のような並列化可能な計算だけです。
    http://www.toffee.jp/streaming/gpgpu/gpgpu_basic/2015/gpgpu_basic08.pdf
    https://matome.naver.jp/odai/2138974716185798201


ではよくある計算のうちで典型的な並列計算が得意とするものは何かということですが、
それは行列行列積と高速フーリエ変換などです。
高速フーリエ変換について
https://ie.u-ryukyu.ac.jp/k118589/2012/01/21/cuda-fft-vs-cpu-fft-using-tesla-c2050/
行列行列積(BLAS3)
https://news.mynavi.jp/article/20160125-nvidia/

CUDAを使うのならcuBLASというライブラリをご存知かと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

既に回答されている方と同じような回答に近いですが、
GPUと機械学習との組み合わせは相性が良いと思います。相性といっているのは、GPUの多数の演算ユニットへ分散処理させる環境が整っています(CUDA.とか)。当然CPUでも分散処理が可能ですが、CPU数が多くノードをまたいだクラスターレベルの分散には新たな環境設定が必要です。
特に機械学習時の逆伝搬を演算する再には時間管理がしやすいGPUが力を発揮します。

一方 画像処理は、得意不得意があります。ご存知レンダリングなどの浮動小数点演算はGPUが圧倒的にちからを発揮します。既にこれらのパワーを使ったLib&環境がたくさん出ています。しかし、画像処理において、条件を入れる・処理が細かく分解できない場合などは各CPUに処理をさせた方が早いです(SIFT処理など)。CPUにはメモリBuffが備わっているが通常なので、画像を一定の大きさで分割しここで一時的に蓄える事により複雑な条件処理を分散して処理する事が可能です。

皆さんプログラムの内容に従い、上手く使い分けて使用されているようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/02 18:33

    https://stackoverflow.com/questions/37669387/why-there-is-no-cudasift-cuda-in-opencv
    https://www2.cs.arizona.edu/~kingmahdi/Files/siftcu_csse.pdf

    得意不得意という意見には賛成ですが、SIFTはどうして高速化できないのでしょうか。

    キャンセル

  • 2018/04/02 19:29

    言い方を変えれば想定ほど大きな効果がないと考えています。負荷が大きいのは浮動小数点演算で8方向のベクトルを見て数値化してゆくところだと思います。OpenCVの中でどのようしているかは不明ですが、プリミティブな実装を教科書通りしていれば各点ごとの演算になります。まとめて各点のベクトルを演算をする方向でGPUの性能をフルに使っても、いずれも各点の判定に戻るはずです。以前似たような、画像演算をした事がありました。がGPUを使た場合と、画像を分離して分散処理し合成しなおした場合の方が効果があった記憶がありましたので今回の例に掲載しました。SIFTの言葉がひっかりるのであれば、SIFTの部分は取り下げます。

    キャンセル

  • 2018/04/02 23:21

    kuma1957さん、コメントをありがとうございます。

    実装にだいぶ依存するのですね。
    上記で調べたリンクではトータルとして2~3倍程度の速度アップなので、GPUなしの実装を最適化することによって差はより縮まりそうです。
    処理したい画像のサイズによっても変わりそうですね。

    GPUでそれなりに高速化できるFFTですが、配列のサイズをメモリにのらないように大きくすると…
    https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&cad=rja&uact=8&ved=0ahUKEwi29Ii14pvaAhXHUZQKHX5BATMQFghiMAU&url=https%3A%2F%2Fipsj.ixsq.nii.ac.jp%2Fej%2F%3Faction%3Drepository_action_common_download%26item_id%3D18188%26item_no%3D1%26attribute_id%3D1%26file_no%3D1&usg=AOvVaw1E6c4AjK6tTm5pH7u0TEA3
    …計算できなくなります。

    CPUの方が「はやい」ことの例でしたので、アルゴリズム的に自明なことではなく実装と実測によってわかるということを確認したかった、というのが上記の私のコメントの意図でした。
    速いことは保証できませんが、早いことは間違いなさそうですね。

    キャンセル

同じタグがついた質問を見る

  • C++

    4444questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    1517questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

  • アセンブリ言語

    116questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

  • CUDA

    111questions

    CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

  • CPU

    52questions