2013年09月09日

カーネル関数内で,何処まで進んだかPrint

カーネル関数内で,
my_cudaPass_inKernel(threadの一次元化ID, 任意の数字);
とすれば,そこまで進んだというのを表示できる関数.
ただ,カーネル関数のPrintの記述の順番と,表示の順番が何故か異なるケースもあるようで.


#define my_cudaPass_inKernel(idx, n) __my_cudaPass_inKernel(idx, n, __FILE__, __LINE__)

inline __device__ void __my_cudaPass_inKernel(const int idx, const int n, const char *file, const int line)
{
if(idx == n){
//compute Capabirity 2.0 or higher
printf("%s (%i) : Pass, in Kernel.\n", file, line);
}
return;
}
posted by にゃんこ at 21:26| Comment(0) | TrackBack(0) | CUDA C

参照渡しとデバイス関数内でのPrintf

以下のように,C++と同様に参照渡しが出来ます.

また,デバイス関数内でもPrintf()出来るのを,今日知ったのでメモ.
Printfは,ComputeCapability2.0以上でないと使用できないようです.
つまり,sm20以上にコンパイルオプションを指定しなければなりません.
他にも,C++とは違った制限・制約・機能があるようですが…
とりあえず動けば良いや的な



__device__ void D_func2(float3 &b)
{
b.x++;
return;
}
__global__ void D_func()
{
float3 a;
a.x= threadIdx.x;
a.y= threadIdx.x;
a.z= -1;
printf("Hello thread %d\n", threadIdx.x);
printf("a.x=%f, a.y=%f, a.z=%f\n", a.x, a.y, a.z);
D_func2(a);
printf("a.x=%f, a.y=%f, a.z=%f\n", a.x, a.y, a.z);
return;
}
posted by にゃんこ at 17:25| Comment(0) | TrackBack(0) | CUDA C