clang / LLVMバージョン3.2を使用して、「nbody」サンプルプログラムのカーネル(nbody_kernel.cu)のPTXコードを生成しようとしています。nbody CUDAプログラムは、NvidiaのSDKで利用できます。
https://github.com/jholewinski/llvm-ptx-samplesプロジェクトを参照しています。
以下は私のコマンドです、
clang ++ -O4 -S -I / usr / local / cuda / include -emit-llvm -target nvptx64 nbody_kernel.cu -o nbody_kernel.ll
opt -O3 -loop-unroll -unroll-allow-partial nbody_kernel.ll -o nbody_kernel.ll
llc nbody_kernel.ll -o nbody_kernel.ptx
最後のコマンド(llc)を実行した後、UNREACHABLEが実行されました!次のスタックトレースでエラーが発生しました
UNREACHABLE executed!
0 libLLVM-3.2svn.so 0x00000033eb79fadf
1 libLLVM-3.2svn.so 0x00000033eb7a01d6
2 libpthread.so.0 0x0000003825a0f500
3 libc.so.6 0x0000003824e328a5 gsignal + 53
4 libc.so.6 0x0000003824e34085 abort + 373
5 libLLVM-3.2svn.so 0x00000033eb788320 llvm::llvm_unreachable_internal(char const*, char const*, unsigned int) + 336
6 libLLVM-3.2svn.so 0x00000033eb43dc37
7 libLLVM-3.2svn.so 0x00000033eb4411a0
8 libLLVM-3.2svn.so 0x00000033eb4422a5
9 libLLVM-3.2svn.so 0x00000033eb210d76 llvm::FPPassManager::doInitialization(llvm::Module&) + 54
10 libLLVM-3.2svn.so 0x00000033eb217ec7 llvm::FPPassManager::runOnModule(llvm::Module&) + 23
11 libLLVM-3.2svn.so 0x00000033eb217ac5 llvm::MPPassManager::runOnModule(llvm::Module&) + 389
12 libLLVM-3.2svn.so 0x00000033eb217c1b llvm::PassManagerImpl::run(llvm::Module&) + 107
13 llc 0x000000000040d157 main + 5415
14 libc.so.6 0x0000003824e1ecdd __libc_start_main + 253
15 llc 0x0000000000409a29
Stack dump:
0. Program arguments: llc nbody_kernel.ll -o nbody_kernel.ptx
1. Running pass 'Function Pass Manager' on module 'nbody_kernel.ll'.
Aborted (core dumped)
たとえば、threadIdx.xのようなグローバルインデックスを__builtin_ptx_read_tid_x()などに置き換えました。LLVM IR(つまり、.ll)の生成に問題はありません。llcを使用してIRからPTXを生成しようとすると、エラーがポップアップ表示されます。
ここで何が起こっているのかについての指針はありますか?