2016-06-13 52 views
0

我有下面的代码,我试图存储我的内核,我编译成一个变量函数,然后可以访问。不幸的是,当我在结构中声明自动kernelTest时,它会抛出一个错误,指出“非静态成员声明为auto”。 cl :: make_kernel实际返回什么,以及如何将它作为私有变量存储?Opencl make_Kernel实际返回什么?我如何存储它?

struct OCLData 
{ 
    cl::Device device; 
    cl::Context context; 
    cl::CommandQueue queue; 

    cl::Program program; 
    auto kernelTest; (PROBLEM) 

    const char *kernelTestSource = MULTILINE(
    __kernel void kernelTest(const int N, __global float* A, __global float* B, __global float* C) 
    { 
     int i = get_global_id(0); 
     int j = get_global_id(1); 
    } 
    ); 

    OCLData(){ 
     try{ 
      // Set Device 
      cl_uint deviceIndex = 0; 
      std::vector<cl::Device> devices; 
      unsigned numDevices = getDeviceList(devices); 
      if (deviceIndex >= numDevices) 
      { 
      std::cout << "Invalid device index (try '--list')\n"; 
      return; 
      } 
      this->device = devices[deviceIndex]; 

      // Set Context and Queue 
      std::vector<cl::Device> chosen_device; 
      chosen_device.push_back(device); 
      this->context = cl::Context(chosen_device); 
      this->queue = cl::CommandQueue(context, device); 

      // Print Device Name 
      std::string name; 
      getDeviceName(this->device, name); 
      std::cout << "\nUsing OpenCL device: " << name << "\n"; 

      // Compile GPU Code 
      this->program = cl::Program(this->context, this->kernelTestSource, true); 
      //auto kernel = cl::make_kernel<int, cl::Buffer, cl::Buffer, cl::Buffer>(this->program, "kernelTest"); 
      this->test = cl::make_kernel<int, cl::Buffer, cl::Buffer, cl::Buffer>(this->program, "kernelTest"); 
      //cl::make_kernel<int, cl::Buffer, cl::Buffer, cl::Buffer> naive_mmul(this->program, "kernelTest"); 
      std::cout << "GPU Code Compiled: " << "\n"; 

     } catch (cl::Error err) 
      { 
      std::cout << "Exception\n"; 
      std::cerr << "ERROR: " 
        << err.what() 
        << "(" 
        << err_code(err.err()) 
        << ")" 
        << std::endl; 
      } 

    } 
}; 
+0

不知道,它创建了什么,但可以使用decltype创建适当类型的成员变量。 – MikeMB

回答

1

cl::make_kernel<int, cl::Buffer, cl::Buffer, cl::Buffer>创建该类型的对象。

根据C++ 11标准auto类成员也必须是static const这意味着它必须被初始化,但是在创建cl::make_kerenl<...>之前有相当多的代码要被执行。在后面的代码

std::shared_ptr<cl::make_kernel<int, cl::Buffer, cl::Buffer, cl::Buffer>> kernelTest;

然后: 在这种情况下,你可以使用std::shared_ptr作为成员类型结构的

this->kernelTest.reset(new cl::make_kernel<int, cl::Buffer, cl::Buffer, cl::Buffer>(this->program, "kernelTest"));

1

我这样做的一个朋友的建议:

typedef cl::make_kernel <float, cl::Buffer&> kernelTestType; 
std::function<kernelTestType::type_> kernelTest; 
this->kernelTest = kernelTestType(this->program, "kernelTest"); 

看起来像这样的作品