技術

cu.hppが一応Windowsでも使えた

この前公開したcu.hppをWindowsでも試してみたら使えた。
といっても確認したコンパイラはVC++ではなくてclang++。

Windows7 & MinGW & cmake & LLVM clangという感じ。
ただしこれは、Driver APIを利用したホストコードだけの話。
nvccを使ったカーネルのコンパイルに必要なものは後述。

MinGWとcmakeはWindows用のインストーラを使ったので楽だった。
clangはWindows用のバイナリをダウンロードして適当なフォルダに入れるだけ。
後は、MinGWとclangのbinにパスを通せば準備完了。

CMakeLists.txtはこんな感じ。

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT(CUDATest)

SET(CMAKE_CXX_COMPILER clang++)
ADD_DEFINITIONS("-Wall -std=c++0x")

INCLUDE_DIRECTORIES("/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v5.0/include")

ADD_EXECUTABLE(main
    main.cpp
    CUDABvh.cpp
)

TARGET_LINK_LIBRARIES(main "/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v5.0/lib/Win32/cuda.lib")

EXECUTE_PROCESS(COMMAND nvcc -ptx -arch=sm_11 kernel.cu)

LINK_DIRECTORIESにライブラリのフォルダを指定してTARGET_LINK_LIBRARIESでライブラリ名(cuda)だけを指定する普通のやり方だと、ld.exeが多分libcuda.aとかを探しに行ってしまいリンクに失敗するのでTARGET_LINK_LIBRARIESにフルパスを渡している。

windows.hなどのヘッダや各種ライブラリを使う場合の事や、nvccがcl.exe(Visual C++ Compiler)等に依存してる事を考えると、MinGWやclangだけではなくWindows SDKかVisual Studioのインストールが必要。
(必要なものを必要な場所に設置してきちんと設定出来るならその限りではないと思うけど、Windowsでその手の事をやるのはかなりしんどいと思う。)
Windows SDKはWindowsというMSの柱となる製品名を冠していながら、インストールの不具合とか放置されててちゃんとやるのがちょっと面倒なので、素直にVisual Studio Expressをインストールする方が現時点では楽。
あと、Windows環境だとnvccはIntelのコンパイラにも対応してるのでそちらを用意できるならcl.exeは必要ないかも。(未確認)
nvccがWindows環境でもgccやclangに対応してくれたらいいのに。

ptxファイルはコンパイル時に指定したアーキテクチャに対応してればGPUが変わってもそのまま使えるので、Driver APIでホストコードとカーネルを分離してる事を利用して、他のマシンでコンパイルしたptxファイルを持ってきてnvccを使わないという選択肢もある。
単なる動作確認で、メインの開発環境じゃないならそれもアリ。
(Driver APIを使ったプログラムの実行に必要なdllはGPUドライバに含まれてるらしいので、カーネルだけじゃなくホストコードのコンパイルも必要ないなら、コンパイラのみならずCUDA Toolkit
さえもインストールは必要ない。)

まぁそもそも最初から全部Visual Studioでやれば上に書いたようなことは全く必要ないんだけど、C++11への対応度がまだ微妙なのであまり使いたくない。
参考: VS2012のコンパイラとg++ 4.7とClang 3.1のC++11対応度の比較記事
1年近く前の記事だけどすでにその時点でclang最強なうえに、かなり活発に開発されてるから現在はさらに最強具合が高まってると思う。
今はもう3.2だし、来月3.3がリリースされる予定。
g++の方も今は4.8が最新みたい。

例のレイキャストのプログラム(SoA化済み)をWindowsに持っていてみたところ、cu.hpp自体は変更が必要なかったけど、それを参照してる側のソースでgettimeofday関数とかを使ってたので、その辺りはWindowsに合わせて修正が必要だった。

Geforce GT 520とGTX 560Tiを積んだWindows機で試してみた。
他のOSも含めたこれまでの処理時間をまとめると次のような感じ。
9400M(Mac 10.8.3) 0.5秒
GT 520(Windows 7) 0.22秒
GTX 460(Ubuntu 13.04) 0.027秒
GTX 560Ti(Windows 7) 0.023秒
性能の差がそのまま現れてるように見える。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください