1

ホストからコードに構造体を渡す方法は知っていますが、問題は、openclでpush_back関数(構造体の組み込み関数)が機能しないことです。私は私のホストに次のような構造を持っています

struct MyKey
{
   int x;
   float y;
   int scale;
   MyKey(int x, float y, int scale) : x(x), y(y), scale(scale){ }
}

この構造のオブジェクトを次のようなホストで作成しました

std :: vector<MyKey> obj;

これをカーネルに渡し、そこに構造体定義を(カーネルに)配置しました。push_back関数を呼び出そうとすると、エラーがスローされます。、

__kernel void test(ui32_t w, ui32_t h, constant struct MyKey* obj, i32_t thrd_size)
 {
         //toatl thread count is w*h
       i32_t i = get_global_id(0);
     if(i<thrd_size)
     {
          for (ui32_t i = 0; i < h; i++)
          {
               for (ui32_t j = 0; j < w; j++) 
                {
                    obj.push_back(MyKey(j,iw,h));
                }
          }
      }
  }

前もって感謝します..

4

2 に答える 2

2

OpenCLのカーネル言語はC99に基づいているため、C++機能を使用することはできません。

さらに、コードは概念レベルで間違っています。構造体のベクトルであると宣言した場合でも、カーネルコードのobjパラメーターは構造体へのポインターにすぎません。MyKeyobjMyKey

于 2013-01-17T08:00:14.513 に答える
2

AMDには、クラスなどの一部のC++機能をサポートする静的C++カーネル言語拡張機能があります。

詳細については、http: //developer.amd.com/wordpress/media/2012/10/CPP_kernel_language.pdfをご覧ください。

ドキュメントから:カーネルコード:

Class Test
{
    setX (int value);
    private:
    int x;
}
__kernel foo (__global Test* InClass, ...)
{
    If (get_global_id(0) == 0)
    InClass->setX(5);
}

ホストコード:

Class Test
{
    setX (int value);
    private:
    int x;
}
MyFunc ()
{
    tempClass = new(Test);
    ... // Some OpenCL startup code – create context, queue, etc.
    cl_mem classObj = clCreateBuffer(context, CL_USE_HOST_PTR,
    sizeof(Test),&tempClass, event);
    clEnqueueMapBuffer(...,classObj,...);
    tempClass.setX(10);
    clEnqueueUnmapBuffer(...,classObj,...); //class is passed to the Device
    clEnqueueNDRange(..., fooKernel, ...);
    clEnqueueMapBuffer(...,classObj,...); //class is passed back to the Host
}
于 2013-01-18T10:34:34.027 に答える