0

我有一个使用 enqueue_event 的简单设备端内核。一切都按预期工作,直到我定义了一个 clk_event_t,我想用它来排队几个相互等待的内核。问题:在定义 clk_event_t 时,“buffer”数组在每个坐标中自动取值 0.0。如果我删除带有 clk_event_t 定义的行,代码将按预期工作,ScalarMultHelp 完全符合我的要求。似乎缓冲区指针以某种方式被更改,因为设置缓冲区 [0] 和缓冲区 [1] 的行根本没有效果。我的代码(简化):

kernel void ScalarMultiply(global double* A, global double* B, global double* buffer,
               global double* buffer_small, int n) {
  const size_t gid = get_global_id(0);
  buffer[gid] = A[gid] * B[gid];
  if (gid == 0) {
    const int subthread_size = 256;
    ndrange_t ndr = ndrange_1D(n, subthread_size);
    clk_event_t marker_event01; // ERROR: sets buffer to {0,0,0,...} !!!!!!!!
    if (enqueue_kernel(get_default_queue(), CLK_ENQUEUE_FLAGS_NO_WAIT, 
        ndr, 0, NULL, NULL, // here, instead of NULL, I will use marker_event01 as returning event
        ^(local void* target){
             scalarMultHelp(buffer, buffer_small, (local double*)target);
               }, subthread_size*sizeof(double) ) != CLK_SUCCESS) {
      buffer[0] = -1;// not doing anything
      release_event(&marker_event01);
      return;
    }
    buffer[0] = 3.0; // not doing anything
    release_event(&marker_event01);
    buffer[1] = 4.0;// not doing anything
  }

内核在 NVIDIA Geforce GTX Ti 1050 上运行,内核程序使用 -cl-std=CL2.0 标志构建,以便使用 NVIDIA 驱动程序启用 opencl 2.0 功能。

我已经尝试找到解决方案很长一段时间了,但我在网上找不到任何东西。

4

0 回答 0