nvccとgccでのオブジェクトファイルのリンク

ねむいですね。
最近ブログのネタがないので、しょーもない内容で記事ひとつ。すぐ↓の説明さえ読んでわかるならそれ以下は見る必要ないですww

さて、CUDAコンパイラnvccの吐くオブジェクトファイルは普通にgccの吐くのと同じELF形式ですので、デバイスコードを記述したソース(*.cu)をnvccで-cオプション付きでコンパイルして出力したオブジェクトファイルとgccで出したオブジェクトファイルをリンクすることができます。

mainから直接nvccを通さないために、カーネルを呼び出すフロントエンド関数を用意

void a_cuda_kernerl_frontend();

デバイスコードがこちら

#include "a_cuda_wrapper.h"

__global__ void cuda_kernel()
{
}

void a_cuda_kernerl_frontend()
{
	cuda_kernel<<<1, 1>>>();
}

そしてnvccを通さないmainがこちら

#include <iostream>
using namespace std;

#include "a_cuda_wrapper.h"

int main()
{
	a_cuda_kernerl_frontend();
}

これで

% g++ -c main.cpp
% nvcc -c kernel.cu
% nvcc main.o kernel.o
% ./a.out

リンクするときにg++じゃなくてnvccを使いましょう。当然ですね。

これで、C++ベースのでかいシステムの一部としてCUDAを用いることもできますね!!
これができることくらい誰でも知ってると思うんだけど、実際にやってるサンプルて見ないなぁと思って(mainまで*.cuに書いてある)
(そうですサンプルにするほどのこともないからです

コメントを残す

メールアドレスが公開されることはありません。