LoginSignup
1
1

Kokkosのビルド・インストール

Kokkosのビルド・インストールは、ドキュメントを参考にCMakeで行うことができます。

  • Documentation

  • GitHub

まずはKokkosのソースコードをダウンロードします。
今回は<tag>4.3.01としました。

$ git clone --depth 1 --branch <tag> https://github.com/kokkos/kokkos.git

ビルドではCPUでSerial、GPUでCUDAを有効にして構築しました。

# CUDAのパスを通す
$ export PATH=$PATH:/usr/local/cuda/bin
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64

# Kokkosのビルド・インストール
$ cmake -B <build directory> -S </path/to/kokkos> \
  -DCMAKE_INSTALL_PREFIX=<install prefix> \
  -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++ \
  -DKokkos_ENABLE_SERIAL=ON -DKokkos_ENABLE_CUDA=ON \
  -DKokkos_ARCH_TURING75=ON # ここはGPUのArchを設定
$ cd <build directory>/core
$ cmake --build .
$ make install kokkoscore

サンプルコードのビルド・実行

Kokkosを構築できたので、Hello Worldを動かしてみます。

Kokkosのソースコードに付いているExampleです。
SerialとCUDAのそれぞれで動かすために、Makefileを編集する必要があります。ビルドするための適当なディレクトリ<workdir>にMakefileをコピーして編集します。

$ cd <workdir>
$ cp </path/to/kokkos>/example/tutorial/01_hello_world/Makefile .

今回の環境に合わせて以下のように編集しました。

  • Makefile(diff)
-KOKKOS_PATH = ../../..
+KOKKOS_PATH = </path/to/kokkos>
KOKKOS_SRC_PATH = ${KOKKOS_PATH}
SRC = $(wildcard ${KOKKOS_SRC_PATH}/example/tutorial/01_hello_world/*.cpp)
vpath %.cpp $(sort $(dir $(SRC)))

default: build
	echo "Start Build"

ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES)))
CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper
CXXFLAGS = -O3
LINK = ${CXX}
LDFLAGS = 
EXE = 01_hello_world.cuda
-KOKKOS_DEVICES = "Cuda,OpenMP"
-KOKKOS_ARCH = "SNB,Kepler35"
+KOKKOS_DEVICES = "Cuda"
+KOKKOS_ARCH = "Turing75"
else
CXX = g++
CXXFLAGS = -O3
LINK = ${CXX}
LDFLAGS =  
EXE = 01_hello_world.host
-KOKKOS_DEVICES = "OpenMP"
-KOKKOS_ARCH = "SNB"
+KOKKOS_DEVICES = "Serial"
+KOKKOS_ARCH = "Native"
endif

DEPFLAGS = -M

OBJ = $(notdir $(SRC:.cpp=.o))
LIB =

include $(KOKKOS_PATH)/Makefile.kokkos

build: $(EXE)

test: $(EXE)
	./$(EXE)

$(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS)
	$(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE)

clean: kokkos-clean 
	rm -f *.o *.cuda *.host

# Compilation rules

%.o:%.cpp $(KOKKOS_CPP_DEPENDS)
	$(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< -o $(notdir $@)

このMakefileではデフォルトはg++でKOKKOS_DEVICES=Cudaを指定するとnvccでビルドされます。また、bcコマンドを入れないと動かないことがあります。

$ sudo apt install bc

まずはSerialで実行してみます。

# CPU Serial
$ make build
:
$ ./01_hello_world.host 
Hello World on Kokkos execution space N6Kokkos6SerialE
Hello from i = 0
Hello from i = 1
Hello from i = 2
Hello from i = 3
Hello from i = 4
Hello from i = 5
Hello from i = 6
Hello from i = 7
Hello from i = 8
Hello from i = 9
Hello from i = 10
Hello from i = 11
Hello from i = 12
Hello from i = 13
Hello from i = 14

次にCUDAで実行してみます。

# Cuda
$ PATH=$PATH:/usr/local/cuda/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH=/usr/local/cuda/lib64 KOKKOS_DEVICES=Cuda make build
:
$ ./01_hello_world.cuda 
Hello World on Kokkos execution space N6Kokkos4CudaE
Hello from i = 0
Hello from i = 1
Hello from i = 2
Hello from i = 3
Hello from i = 4
Hello from i = 5
Hello from i = 6
Hello from i = 7
Hello from i = 8
Hello from i = 9
Hello from i = 10
Hello from i = 11
Hello from i = 12
Hello from i = 13
Hello from i = 14

execution spaceが変わっているので実行デバイスが切り替わっているようです。
Kokkosについては引き続き勉強していきたいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1