在opencl中乱序执行事件

时间:2019-02-10 17:20:14

标签: c++ opencl

使用事件在opencl中乱序执行

我是opencl编程范式的新手,所以如果我做的不好,请多多包涵。 我试图创建一个std :: vector并在enququemigratemem和enquuekernel中使用它,但是它要么因无效事件而失败,要么CPU仿真失败。

// defined the events variables as global variables

cl::Event new_event;
std::vector<cl::Event> write_event(3);
std::vector<cl::Event> read_event(3);


 // in a allocator function I am pushing the new event in here

A()
{

     for (int i = 0  ; i < 2 ; i++){
        (write_event).push_back(new_event);
        (read_event).push_back(new_event);
     }

 }  

 // top function calling the kernel function.

  top()
  {

   for(i=0;i,50;i++)
    {

       func1()

     }

   }
  // actual exectuion  

   func1()
   {


    cl_int err;

    int falgs = k%2+1;


    for(int i=0;i<N;i++)
    {
      S[i] = i[i];
     }

       OCL_CHECK(err, buffer_source[falgs] = cl::Buffer(context, 
        CL_MEM_USE_HOST_PTR | CL_MEM_READ_ONLY,
              sizeof(uint16_t) * PatternLength, S, &err));

       OCL_CHECK(err, buffer_output[falgs] = 
       cl::Buffer(context,CL_MEM_USE_HOST_PTR | CL_MEM_WRITE_ONLY,
              sizeof(uint32_t), result, &err));

      uint16_t set =0;


       OCL_CHECK(err, err = 
       q.enqueueMigrateMemObjects({buffer_source[falgs]},
       0,NULL,&write_event[falgs]));


     OCL_CHECK(err, err = krnl_cluster.setArg(0, buffer_source[falgs]));

     OCL_CHECK(err, err = krnl_cluster.setArg(5, buffer_output[falgs]));

     OCL_CHECK(err, err = krnl_cluster.setArg(6, PatternLength));

     OCL_CHECK(err, err = krnl_cluster.setArg(7, MaxTrialsForPV));

     OCL_CHECK(err, err = krnl_cluster.setArg(8, set));

        std::cout<<" 3 "<<std::endl;

     OCL_CHECK(err, err = q.enqueueTask(krnl_cluster, &write_event ));

     //, &kernel_events[falgs]));

    std::cout<<"after the enqueue teask"<<std::endl;

    q.finish();

       OCL_CHECK(err, err = 
      q.enqueueMigrateMemObjects({buffer_output[falgs]},             
      CL_MIGRATE_MEM_OBJECT_HOST));

      //,&eventList,&read_event[falgs][0]));


    }

我正在尝试执行乱序执行,我有以下问题:

  1. 我是否必须为每次内核执行创建一个新事件,还是可以使用现有事件?
  2. 我必须创建50个缓冲区还是可以创建2个缓冲区并重用它们,该怎么做?
  3. 我的程序在做错什么。
  4. 我应该始终使用set kernel args设置所有内核参数吗?
  5. 为了减少应用程序时间,我应该在我的类构造函数中分配缓冲区还是在多次调用内核时创建缓冲区?
  6. 我可以替换它们的最耗时的opencl API是什么?
  7. 我研究了一些有关opencl的示例,发现它们没有在C ++ opencl代码中释放缓冲区/事件,而在C openCL中却释放了缓冲区/事件。 C ++ openCL API是否会自动执行

非常感谢您的帮助。

0 个答案:

没有答案