準備
提供: メモ帳@fmaj7b5.info
2周くらい遅れのCUDAをやってみる。 ここではWindowsを使うけど、CUDAはOSに依存しないので他でも大丈夫・・・だと思う。
目次 |
プログラム環境を整える
以下の二つをインストール:
- Visual C++ 2010 Express
- CUDA Toolkit
ググれば出てくるはずだけど、CUDAのダウンロード先で迷ったことがあるのでヒントを少々。CUDA周りのツール類は「NVIDIA > CUDA Zone > Download」と辿っていけば見つかる。とりあえずCUDA ZoneでDownloadとかToolkitとか書いてあるところをポチポチしよう。
細かいところは先人のwebページを参考にしてね。
コンパイル方法
最低限必要なのは以下の三つ:
- *.cuをCUDAコンパイラ(nvcc)でコンパイルするように指定する
- CUDAコンパイラに対象にするGPUのアーキテクチャ(-arch)とcompute capability(-code)を指定する
- cudart.lib (linuxだとlibcudart)をくっつけるよう指定する
Visual C++
GUIは説明が面倒だ・・。
- プロジェクトを追加
- コンソールアプリケーションとか、適当に
- ビルドのカスタマイズ > CUDA x.x にチェック
- *.cuソースを追加
- プロパティ > CUDA C/C++ > Device > Code Generation で対象GPUを指定
- リンカー > 入力 > 追加の依存ファイル にcudart.libを追加
まあ、詳しくはググるべし。
CMake
Linuxな人はこっちが簡単かも。WindowsでVC++な人でも使えるので、便利な人には便利。
CMakeLists.txt: cmake_minimum_required (VERSION 2.8) project (HelloProject) find_package (CUDA REQUIRED) cuda_add_executable (hello hello.cu)
cmake_minimum_requiredのバージョンは手持ちの環境に合わせただけなので、もっと低くても大丈夫かも知れない。
GNU Make
いや、漢(おとこ)ならmakeだ。という人の場合。CMakeもLinuxなら最終的にmakeするじゃん、というツッコミは無しで。
cuda.mk: # Set a default location of CUDA CUDA_HOME ?= /usr/local/cuda # Set an architecture ifeq ($(ARCH),) ARCH = $(shell uname -i | tr '[:upper:]' '[:lower:]') endif # Binary path to CUDA CUDA_BINDIR = $(CUDA_HOME)/bin # Set library dir and nvcc command ifeq ($(ARCH),x86_64) CUDA_LIBDIR = $(CUDA_HOME)/lib64 NVCC = $(CUDA_BINDIR)/nvcc else CUDA_LIBDIR = $(CUDA_HOME)/lib NVCC = $(CUDA_BINDIR)/nvcc -m32 endif # Set default parameters for CUDA libraries CUDA_LDFLAGS ?= -L$(CUDA_LIBDIR) CUDA_LDLIBS ?= -lcudart # Build rules %.o: %.cu $(NVCC) $(NVCC_FLAGS) -c -o $@ $^ %.ptx: %.cu $(NVCC) $(NVCC_FLAGS) --ptx -o $@ $^ %.ptx: %.gpu $(NVCC) $(NVCC_FLAGS) --ptx -o $@ $^ %.gpu: %.cu $(NVCC) $(NVCC_FLAGS) --gpu -o $@ $^
Makefile: include ./cuda.mk LDFLAGS = $(CUDA_LDFLAGS) LDLIBS = $(CUDA_LDLIBS) NVCC_FLAGS = --generate-code=arch=compute_30,code=sm_30 TARGETS = hello all: $(TARGETS) clean: $(RM) $(TARGETS) *.o *~ hello: hello.o
適当なので、あくまでも参考までに。大体、Makefileを手書きする変態さんならもっといいのを既に書いてるでしょう・・。