クラス内カーネル

CUDA 4.0の話です。古くてごめんなさい。

nvccは限定的ながらC++に対応してるということで、例えばクラスメンバがvirtualだったりするとダメとかみたいな制限はあるんですが、カーネル自体がクラスメンバになれないとは。

class ACUDAClass
{
	__global__ void kernel();
public:
	void func()
	{
		kernel<<<1, 1>>>();
	}
};

void ACUDAClass::kernel()
{
}

int main()
{
	ACUDAClass ob;
	ob.func();
}

こんなエラーが出ます。

% nvcc prog.cu
prog.cu(3): error: illegal combination of memory qualifiers

1 error detected in the compilation of "/tmp/tmpxft_00003d82_00000000-4_prog.cpp1.ii".

もちろん、こういう風にクラスメンバからカーネルを呼ぶのは何も問題ありません。

__global__ void kernel()
{
}

class ACUDAClass
{
public:
	void func()
	{
		kernel<<<1, 1>>>();
	}
};

int main()
{
	ACUDAClass ob;
	ob.func();
}

理由はどうも単純なもので、thisをカーネルに渡せないからクラスメンバとしては置けないよ!!というアレみたい。

ならばと思ってカーネルをstaticにしても同じエラーがでます。はて。
例えばグローバル変数(ホスト側にある)を参照するとundefined symbolってちゃんとエラー吐けてるから同じ程度の問題のような気もする。

ところが、__device__だとおっけーなんですね。
ふむ。わからん。

誰かホントのところ教えてくだしあ。
あと最初に言ったようにこれCUDA 4.0での話なので4.1ではどうなってるか未確認です。ごめんね∩(・ω・)∩

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に書いてある)
(そうですサンプルにするほどのこともないからです

LinuxでのeclipseのPleiadesによる日本語化のメモ

設定としては全く難しいこともめんどくさいこともないけど,いっつもやり方わすれてあれれってった末にどうせ英語でも困らないからいいやって放置しちゃってるので,この際メモ.

Windows/Mac版eclipseでも手動で日本語化する手順はいっしょなんじゃないかな?未確認ですが.
これからeclipse導入するというWindowsの人であればpleiadesサイトにある日本語化済みのを落としてくればいいと思います.

まずPleiadesを落としてきます.
http://mergedoc.sourceforge.jp/#pleiades.html
ここの最新版とか安定板の方を.All in Oneは違います.

で,これをeclipseのルートに展開します.
つまり,展開して出てくるpluginsとかfeaturesディレクトリで,eclipseルートにあるplugins,featuresを上書きしちゃうような位置で.

んで,eclipse.iniに

 -javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

を追記.

これでおk