質問

OpenCL カーネルで gmp タイプ (mpz_t、mpq_t など) のようなカスタムタイプを使用することはできますか?

このようなものを持つには (このカーネルは、次のような理由だけで構築されるわけではありません) #include <gmp.h>) :

#include <gmp.h>
__kernel square(
   __global mpz_t* input,
   __global mpz_t number,
   __global int* output,
   const unsigned int count)
{
   int i = get_global_id(0);
   if(i < count)
       output[i] = mpz_divisible_p(number,input[i]);
}

おそらく、4 番目のパラメータに別の引数を追加することによって (オプション) の clBuildProgram ?

それとも OpenCL にはすでに処理できる型があるのでしょうか? 大きい 数字?

役に立ちましたか?

解決

は、カスタムタイプが、カーネルで使用されるものを使用することができ、具体的にOpenCLのために書かれる必要があります。大きな精度の数値を実装する方法のために、おそらく、このウェブサイトをチェックアウト: FP128する

編集:NVIDIAのCUDA SDKは、複素数データ型を持っている、それは理想的ではないのですが、あなたは、彼らはそれについて移動方法についていくつかのアイデアを与える可能性があり、OpenCLのは似ている必要があります。

他のヒント

一般的に、あなたはOpenCLのプログラム内の任意の型を使用することができます。輸入は動作しませんので、しかし、あなたは、同じプログラム内でそれらを再定義する必要があります。たとえばます:

typedef char my_char[8];

typedef struct tag_my_struct
{
    long int        id;
    my_char         chars[2];
    int             numerics[4]
    float           decimals[4];
} my_struct;

__kernel void foo(__global my_struct * input,
                  __global int * output)
{
    int gid = get_global_id(0);
    output[gid] = input[gid].numerics[3]== 2 ? 1 : 0;
}

しかし、あなたは明らかに同じOpenCLの内と外の定義を維持する必要があります。また、タイプがデバイスとホスト(トリックを行う必要がありますsizeof(my_struct)を使用)の両方で同じ大きさを持っていることを確認してください。いくつかのケースでは、私はサイズが一致しているために、定義を調整する必要がありました。

VHristovの回答とdieterのコメントを使用して、自分のものを機能させました。このコードは OpenCL 1.2 で動作します

カーネル

typedef struct tag_my_struct{
  int a;
  char b;
}my_struct;

__kernel void myKernel(__global my_struct *myStruct)
{
    int gid = get_global_id(0);
    (myStruct+gid)->a = gid;
    (myStruct+gid)->b = gid + 1;
}

ホスト

typedef struct tag_my_struct{
  cl_int a;
  cl_char b;
}my_struct;

void runCode() 
{
    cl_int status = 0;
    my_struct* ms = new my_struct[5];

    cl_mem mem = clCreateBuffer(*context, 0, sizeof(my_struct)*5, NULL, &status);
    clEnqueueWriteBuffer(*queue, mem, CL_TRUE, 0, sizeof(my_struct)*5, &ms, 0, NULL, NULL);

    status = clSetKernelArg(*kernel, 0, sizeof(ms), &mem);

    size_t global[] = {5};
    status = clEnqueueNDRangeKernel(*queue, *kernel, 1, NULL, global, NULL, 0, NULL, NULL);

    status = clEnqueueReadBuffer(*queue, mem, CL_TRUE, 0, sizeof(my_struct)*5, ms, 0, NULL, NULL);

    for(int i = 0; i < 5; i++)
        cout << (ms+i)->a << " " << (ms+i)->b << endl;
}

出力

0 ☺

1 ☻

2 ♥

3 ♦

4 ♣

あなたがカーネルファイルにヘッダファイルを含めたい場合は、

は、のディレクトリのは、ヘッダファイルとディレクトリですclBuildProgram、引数としての-l dirのを追加することができますます。

ここで

その他の説明: のOpenCLの.clファイルにヘッダを含めますP>

ソース:のhttp:// WWW .khronos.org /レジストリ/ CL / SDK / 1.0 /ドキュメント/男性/ XHTML / clBuildProgram.htmlする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top