3

OpenCLカーネルでカスタムデータ構造を使用しようとしています。ホストプログラムで次のような単純な構造を定義しました。

struct myStruct{
   cl_ulong n_occ;
   cl_ulong start_time;
   cl_ulong end_time;
   cl_ulong exec_time;
   cl_ulong total_time;
   cl_float avg_time;
} myStruct_t;

同等のカスタムデータ構造定義も私のOpenCLカーネルで行われます。

struct myStruct{
   unsigned long n_occ;
   unsigned long start_time;
   unsigned long end_time;
   unsigned long exec_time;
   unsigned long total_time;
   float avg_time;
} myStruct_t;

カーネル関数は次のとおりです。

__kernel void process_data( __global myStruct_t* input, __global myStruct_t* output){
    output->start_time = input->start_time;
    output->end_time = input->end_time;
    output->exec_time = input->end_time - input->start_time;
    output->total_time = input->total_time + output->exec_time;
    output->n_occ = input->n_occ + 1;
    output->avg_time = output->total_time / output->n_occ;
}

GPUデバイスとしてNvidiaカードを使用しています。カーネルコードの実行後、間違った結果が得られました。理由がわかりません。何か足りないものはありますか?

よろしくお願いします。

4

1 に答える 1

5

ホスト構造体 (C) が正しくパックされているかどうかを確認しましたか(OpenCL 側が正しくパックされ、両方が同じサイズを報告していることも確認してください)。両方の構造体で同じ cl_* 型を使用することもおそらく良い考えです。

于 2012-08-13T15:32:33.073 に答える