C++ AMPを用いたGPUプログラミングwiki
首都大学東京 田川研究室
C++ AMP 目次へ

困ったときのQ&A

困った時にどうやって状況を打開したかを記します。
C++基礎 Q&Aのこちらも参考に コンパイルできない1 32bitでコンパイルしたい 意味不明なコンパイルエラーが出る コンパイルに時間がかかる ドライバーの応答停止 ドライバーの応答停止2 OSごとフリーズする エミュレータって? どういうマシンがおすすめ?

コンパイルできない1


いかに示すことだけはまず確認を。ログインユーザー名はローマ字オンリーで作成ください。どのエラーかは忘れましたが、C++AMPのコンパイルが失敗するようになります。
すでに日本語で作ってしまった人は、テンポラリフォルダのファイルパスをシステムの環境変数から変えてください。Windows8(7もおそらく)の場合、

コントロールパネル->システムとセキュリティ->システム

を開いて、左側にある詳細設定をクリックします。以下のシステムのプロパティが表示されるかと。

右下の環境変数をクリックすれば以下のダイアログとなりますので、TMPを変更します。TEMPも変えた方がのちのためでしょうね。
Cドライブのトップディレクトリに、tmp , tempなどのフォルダを作ります。これを新しい一時ディレクトリにしますので。日本語にしないでください。半角英数だけでお願いします。
管理者権限を振りかざし、tmp , tempフォルダを作った場合を以下に示します。

これで大丈夫です。たぶん。

32bitでコンパイルしたい

無理です。
C++ AMPは64bitコンパイラしか提供されていないようです。

意味不明なコンパイルエラーが出る

C++ AMPはクラステンプレートを用いているので、どこで宣言の仕方を間違えたか追跡できません。私もわかりません。
落ち着いて、ブロックをコメントアウトする等して記述ミスを探しましょう。

コンパイルに時間がかかる

私はC++ AMPよりもコンパイルに時間がかかる言語を見たことがありません。対策としてはプリコンパイル済みヘッダを用いてファイルを分割することくらいですね。2分かかるコンパイルが1分で終わりました。

ドライバーの応答停止

これにはいろんな理由がありますが、以下の確認を。
  1. 配列のアクセスオーバー
  2. GPUのメモリが足りない
  3. 重すぎる処理を渡した
  4. ドライバーが不安定
等ですね。

1番ぐらいは解決してください。

2番はご利用のGPUのメモリ搭載量を確認してください。GPU-Z、MSI-AfterBuner等のソフトを利用すればわかります。80%くらいの利用率で抑えておいた方が安全です。現在のGPUに仮想メモリの機能はありません。足りなければそのまま仕事を放棄します。見かねたOSがGPUの再起動を図るのです。

3番、これは気が付きにくいですね。どうやらGPUは忙しいと返事をしなくなるようです。Windows8の規定では2秒間応答がないとGPUの再起動をかけるようです。Micorosoftのホームページではそんなに重い処理を渡すなと書いてありました。数回に分けて処理させるなど工夫をしましょう。
具体的な例では、AMD GPU R9 280X に2000万スレッドを発行し、各スレッドで3*3の行列演算を300回繰り返したところWindows8に再起動をかけられました。500万スレッドづつに減らしたところ大丈夫でした。ここら辺が目安ですね。
性能が低いGPUではもっと気を付ける必要があります。あくまで2秒しか待ってくれませんので。

上記3つで解決しない場合、OSの再起動、アップデート、ドライバーの再インストールを試みましょう。4番の原因となります。ウイルスソフトは迷わず消しましょう。

ドライバーの応答停止2

GPUのスペックには、利用できるテクスチャステージ段数といったものがあります。C++ AMPで1度に利用できるarray変数の数はこれに比例しますので、低価格帯のGPUでは利用できる変数が少なかったりします。
テクスチャステージは読み取り専用レーンと書き込み専用レーンに分かれていたりしますので、読み込みしか行わない変数には読み込み専用のマークを以下のようにつけておくことで解決する可能性があります。
        array_view<int , 2> vAGpuView();      //読み書き可能
        array_view<const int , 2> vAGpuView();//読み取りのみ
        vAGpuView.discard_data();//書き込みのみ。データ破棄という不穏な表現ですが・・・
だいたい 8 段以上の array 変数を用いるとフリーズしたりします。R9 280X では上限が問題になったことはないです。16段はいけるんじゃないでしょうか。

OSごとフリーズする

実はこれ、Windows8ではほぼありえない状況です。相当厳しいバグがない限り、OSごと消え去ることはないですね。デバッグモードでGPUコードを実行しているとたまになりますが。

GPUの冷却不足がないか確認を

MSI AfterBurnerを使ってファンを全開にしましょう。市販GPUは適当なつくりのものが多く、長期的な数値計算に耐えるものではありません。そこらへんの信頼性を補うためにはファンを多少強力に回しましょう。
それでもだめならGPUが壊れているのでは。

エミュレータって?

"GPUを探してみよう!" の項でGPUを探すコードを書きましたが、その時エミュレータで構成されているGPUの表示を省いたと思います。実はこのエミュレータでC++AMPのコードを回すことができます。

上記は"GPUを探してみよう!"のコードを私のPCで実行してみた結果です。
  • 0 : AMD Radeon HD 7900 Series
    普通のGPUです。実際はR9 280Xのはずですが。AMDのドライバーを入れるとちゃんと表示された記憶があります。
  • 1 : Microsoft Basic Render Driver
    CPUのベクトル演算回路、全コアを用いた高速なGPUエミュレータです。倍精度計算もでき、利用可能なメモリ量もPCに搭載されているものとなります。0GBと表示される理由はわかりません。
  • 2 : Software Adapter
    GPUコードのデバック等に使えるのでは?とても遅いです。
  • 3 : CPU accelerator
    よくわかりません。

どういうマシンがおすすめ?

以下、R9 280X 利用の場合。
  • PCIExpress ver2.0なら*16レーン、ver3.0なら*8レーンあった方が良いです。
  • 電源は12V系統が何Aの電流を出力できるか。GPU用に30Aないと無理です。
  • CPUの性能はさして重要ではないです。1万円以上のCPUなら大丈夫でしょう。
  • メインメモリは最低、GPUのメモリ総量+2GBはないとだめです。
  • デスクトップ描画がおろそかになるので、内臓GPUを用いて描画する。

C++ AMPを走らせたGPUは恐ろしいほど全力で回ります。どんなゲームよりも高負荷な状態となりますので、冷却に気を配ってください。ラジエーター、ヒートパイプの巨大なモデルがおすすめです。