準備

提供: メモ帳@fmaj7b5.info
2012年11月8日 (木) 00:54時点における白飯 (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

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は説明が面倒だ・・。

  1. プロジェクトを追加
    • コンソールアプリケーションとか、適当に
  2. ビルドのカスタマイズ > CUDA x.x にチェック
  3. *.cuソースを追加
  4. プロパティ > CUDA C/C++ > Device > Code Generation で対象GPUを指定
  5. リンカー > 入力 > 追加の依存ファイル に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を手書きする変態さんならもっといいのを既に書いてるでしょう・・。