メニュー

技術ブログ

Denso IT Lab.社員による技術情報の紹介

Denso IT Laboratory researcher's blog sites

数式

RSS

ページトップへ

El capitan でthunderbolt外付けGPUを使う

Mac OS のEl capitanでthunderboltで繋いだ外付けGPUを使う方法を説明します。

[対象]

Macで外付けGPUを認識できて嬉しい人は例えば

  • Matlabなどの数値計算ライブラリで大きな行列の計算をGPUを使って高速化したいひと
    • 私の目的はこれです
  • 動画や画像処理などGPGPUに対応したアプリを利用していて作業効率をアップしたいひと
    • Photoshopなどが高速なりなります.CUDA対応アプリはNVIDIAのサイトにのっています.
  • MacBookなどでディスクリートGPUを搭載していないけど、綺麗な映像でゲームをしたいひと
    • 私は試していませんがあまり効果がないと言っている人もいます.

[注意]

失敗すると最悪OSの再インストールになります.

起動しなくなった場合に復旧する方法も記載しますがそれでもうまくいかない場合は再インストールになります.試す前にTimeMachineなどでバックアップをとることをおすすめすします.

!!!自己責任でおねがいします!!!

[必要なもの]

  • Thunderbolt端子を備えたMac
    • OSは10.11,MacはiMac Late 2012で試したいます
  • Thunderbolt PCIe Expansion ケースとケーブル
    • NA-211TBなど (秋葉館などでうっています 10万ちかくします)
  • それなりに高級なGPU
    • 今回の実験ではNVIDIA Quadro K6000(VRAM が12288 MBもあります)

[やりかた]

ステップ1:SIPを無効にする

  • Command-Rを押しながらMac を再起動
  • UtilitiesからTerminalを起動し以下のコマンドを実行
    • csrutil disable
  • ”SIP”を無効にしましたみたいなメッセージが表示されます
  • 再起動

ステップ2: kext開発モードを有効にする

  • コマンドラインから以下のコマンドを実行
    • sudo nvram boot-args=”kext-dev-mode=1″

ステップ3:Kextファイルを書き換える

  • 以下の2つのファイルを書き換えます.
    • /System/Library/Extensions/NVDAStartup.kext
    • /System/Library/Extensions/IONDRVSupport.kext
  • これらのファイルを右クリックして”パッケージの内容を表示”をクリックして中のInfo.plistをかきかえます
  • それぞれのplistファイルから<key>CFBundleIdentifier</key> を探してそのエントリの終わり(</dict>の直前)に<key>IOPCITunnelCompatible</key><true/>を追加します
  • Kextパーミッションの修正
    • Kext Utilityを起動を起動すると自動でパーミッションの修正をしてくれます1分くらいまつと完了します

ステップ4:CUDA driverの(再)インストール

  • NVIDIAよりCUDAのドライバーをダウンロードしてインストールします
  • すでにCUDAラインバーをインストールしてある場合でもインストールしなおしますステップ4:接続
  • シャットダウン
  • 外付けGPUを接続
  • 電源ON

うまくいけばこれで認識します.

スクリーンショット 2015-11-11 午前9.07.09

外付けGPUにはディスプレーを繋いでいないので,12288 MBのほぼ全部を計算用に利用でき,大きな行列の掛け算もCPUでやる場合に比べて大幅に高速化しました.高速化の度合いはやりたい処理や実装に大きく依存しますが,GPUへのデータ転送が少なくなるように工夫することで,私の研究ではCPUで処理する場合に比べて10倍以上の高速化ができました.

今回の機材では,PCIレーン幅が内蔵がx16に対して,外付けはx8です.したがって,データ転送が頻繁にあるようなケースではかえって遅くなる場合があります.

 

[補足]

ステップ1でおこなったSIPの無効化について

El CapitanからSystem Integrity Protection (SIP)という機能が追加されています(“rootless” modeとも呼ばれるようです ).システムファイルをを書き換えるマルウェアからの攻撃に対する頑健性を向上させるために,システムファイルの書き換えをできなくしてしまう機能です.なのでEl Capitanにおいてシステムファイルはsudoでも書き換えられません.今回はシステムファイルを書き換える必要がありますのでステップ1でこれを無効にしています.

 

ステップ3でKextファイルの書き換えについて

この記事では,説明した2つのファイルに加えて,/System/Library/Extensions/AppleHDA.kext/Contents/PlugIns/AppleHDAController.kextを書き換えると説明がありますが,私の環境ではこれらのファイルを書き換えるとOSが起動しなくなりました.

 

OSが起動しなくなった場合の対処方法

ターゲットディスクモードで起動して他のMacから修正したKextファイルを元に戻します.それでもだめな場合はOSの再インストールになります.(私はうまく認識するまで3回OSを再インストールしました)

 

OSのアップデートについて

OSがアップデートすると(マイナーでも),せっかく書き換えたKextファイルが元にもどってしまい,外付けGPUが認識しなくなります.その場合は上記の手順を再度繰り返す必要があります.

 

NVIDIA Maxwell cards

今回使用したGPUはQuadroシリーズですが,GTX 750などのMaxwellシリーズの場合はAPPLEの純正ドライバではなく,NVIDIAのドライバーを使う必要があるようです.その場合はNVIDIA Webドライバーのインストールの必要があります.インストール方法は最後に示す参考サイトに記載があります.またこの場合には/System/Library/Extensions/NVDAStartupWeb.kextも書き換える必要があるようです.私の環境(Quadroの場合)では,Webドライバーを使うとOSが起動しなくなりました.

 

Hotplug

上記の方法で接続した外付けGPUはHot plugには対応しませんので,ケーブルを引っこ抜くとOSが落ちます.また,個体差もあると思いますが私が使ったケースはThunderboltケーブルの差し込みが緩いようでケーブルに触れると再起動してしまう場合もあります.

 

[参考サイト]

本記事はこのブログの情報をもとにかいています.私の環境ではここではで示してある方法そのままではOSが起動しなかったですが,試行錯誤の結果上記の方法で認識しました.

このサイトには様々な環境での成功・失敗談があります.上述した方法でうまくいかない場合は参考にしてください.

このエントリーをはてなブックマークに追加

MATLAB2015b on OSX10.11でmex -setupがこける

タイトル通りです.
XcodeのSDKにMATLABのmexの設定が追いついていない模様.
Mathworkの中の人が答えてます.
これから,このxmlを編集すればよいのですかな.mexopt.hを直接いじるよりはよさそうではある.

参考リンク

MATLAB2015b.appに含まれる,clang_maci64.xmlとclang++_maci64.xmlを変更して,SDKを10.11を使うようにすればよい.
これらのXMLファイルは,以下のMATLABのコマンドでエディターで開ける.

> edit ([matlabroot '/bin/maci64/mexopts/clang++_maci64.xml'])
> edit ([matlabroot '/bin/maci64/mexopts/clang_maci64.xml'])

このXMLファイル中のSDKのパス設定に以下のように10.11の分を追加すれば良い.

<or>
<dirExists name="$$/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk"/>
<dirExists name="$$/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk"/>
<dirExists name="$$/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk"/>
<cmdReturns name="find $$ -name MacOSX10.9.sdk"/>
<cmdReturns name="find $$ -name MacOSX10.10.sdk"/>
<cmdReturns name="find $$ -name MacOSX10.11.sdk"/>
</or>

Mathworkさん,この辺,もうちょっとエレガントに自動で検知してもらえないですかね.

このエントリーをはてなブックマークに追加