CUDAテストの続き

前回に続き、CUDAを試してみる。動作環境は以前のエントリを参照。

ソースコード

前回と同様に下記のサイトから拝借した。ソースはそのまま利用できる。

Makefile

CUDAのツールキット類をインストールすると下記のフォルダにサンプルコードが多数入るのだが、全てのプロジェクトで共通の長いmakefileを使っており、これは少々扱いにくい。

/Developer/GPU_Computing/C/src

そんなわけで簡単なmakefileを用意した。

BIN               := cuda002
 
# flags
CUDA_INSTALL_PATH := /usr/local/cuda
CUDA_SDK_PATH     := /Developer/GPU_Computing/C
INCLUDES          := -I$(CUDA_SDK_PATH)/common/inc
LIBS              := -L$(CUDA_SDK_PATH)/lib -L$(CUDA_INSTALL_PATH)/lib -lcutil -lcudart -lstdc++ 
CFLAGS            := -O3
LDFLAGS           := 

# compilers
NVCC              := $(CUDA_INSTALL_PATH)/bin/nvcc
CC                := gcc
LINKER            := gcc

# files
C_SOURCES         := $(wildcard *.c)
CU_SOURCES        := $(wildcard *.cu)
HEADERS           := $(wildcard *.h)
C_OBJS            := $(patsubst %.c, %.o, $(C_SOURCES))
CU_OBJS           := $(patsubst %.cu, %.o, $(CU_SOURCES))
 
$(BIN): clean $(C_OBJS) $(CU_OBJS) $(HEADERS)
	$(LINKER) -o $(BIN) $(CU_OBJS) $(C_OBJS) $(LDFLAGS) $(INCLUDES) $(LIBS)
$(C_OBJS): $(C_SOURCES) $(HEADERS)
	$(CC) -c $(C_SOURCES) $(CFLAGS) $(INCLUDES)
$(CU_OBJS): $(CU_SOURCES) $(HEADERS)
	$(NVCC) -c $(CU_SOURCES) $(INCLUDES)
run: $(BIN)
	LD_LIBRARY_PATH=$(CUDA_INSTALL_PATH)/lib ./$(BIN)
clean:
	rm -f $(BIN) *.o
ビルド・実行

ビルドして実行する。

$ make run
rm -f cuda002 *.o
/usr/local/cuda/bin/nvcc -c cuda002.cu -I/Developer/GPU_Computing/C/common/inc
gcc -o cuda002  cuda002.o   -I/Developer/GPU_Computing/C/common/inc -L/Developer/GPU_Computing/C/lib -L/usr/local/cuda/lib -lcutil -lcudart -lstdc++ 
LD_LIBRARY_PATH=/usr/local/cuda/lib ./cuda002
Using device 0: GeForce 9400M
Input, Output
0.000000, 0.000000
1.000000, 2.000000
2.000000, 4.000000
3.000000, 6.000000
(中略)
99.000000, 198.000000
Processing time: 32.800999 (ms)

Press ENTER to exit...

単なる計算処理だけど、CPUではなくGPU上で行われている。