OpenCL不一致的减少步骤取决于工作组的数量

时间:2015-06-11 16:15:57

标签: c opencl

我运行一个大小为2的工作组的简单OpenCL内核。内核在结果数组中存储全局ID mod 2,对于索引为0的每个线程,将组的结果数组的总和存储在reduce数组中。返回到C代码时,在最后20个元素之前,数字不匹配。发生了什么事?

OpenCL内核:

__kernel void hello (__global long* reduceBuffer, __global long* result, local long* sum) {
    int id = get_global_id(0);
    int tnum = get_local_id(0);
    int wgNum = get_group_id(0);
    int numItems = get_group_id(0);
    result[id] = id % 2;
    sum[tnum] = result[id];
    barrier(CLK_GLOBAL_MEM_FENCE);
    barrier(CLK_LOCAL_MEM_FENCE);
    if (tnum == 0) reduceBuffer[wgNum] = sum[0] + sum[1];
    barrier(CLK_LOCAL_MEM_FENCE);
    barrier(CLK_GLOBAL_MEM_FENCE);
}

C代码:

int main() {
    size_t numElements = 128;
    size_t workGroupSize = 2;
    // OpenCL preamble with lots of buffer initialization

    clEnqueueNDRangeKernel (command_queue, kernel, 1, NULL, &numElements, &workGroupSize, 0, NULL, NULL);
    // read result from write buffers
    for (int i = 0; i < numElements/workGroupSize; i++) {
        printf("%d. %ld %ld\n", i, reduceArr[i], resultArr[2 * i] + resultArr[2 * i + 1]);
    }
    // free everything
    return 0;

}

输出:

  
      
  1. 0 1
  2.   
  3. 0 1
  4.   
  5. 0 1
  6.   
  7. 0 1
  8.   
  9. 0 1
  10.   
  11. 0 1
  12.   
  13. 0 1
  14.   
  15. 0 1
  16.   
  17. 0 1
  18.   
  19. 0 1
  20.   
  21. 0 1
  22.   
  23. 0 1
  24.   
  25. 0 1
  26.   
  27. 0 1
  28.   
  29. 0 1
  30.   
  31. 0 1
  32.   
  33. 0 1
  34.   
  35. 0 1
  36.   
  37. 0 1
  38.   
  39. 0 1
  40.   
  41. 0 1
  42.   
  43. 0 1
  44.   
  45. 0 1
  46.   
  47. 0 1
  48.   
  49. 0 1
  50.   
  51. 0 1
  52.   
  53. 0 1
  54.   
  55. 0 1
  56.   
  57. 0 1
  58.   
  59. 0 1
  60.   
  61. 0 1
  62.   
  63. 0 1
  64.   
  65. 0 1
  66.   
  67. 0 1
  68.   
  69. 0 1
  70.   
  71. 0 1
  72.   
  73. 0 1
  74.   
  75. 0 1
  76.   
  77. 0 1
  78.   
  79. 0 1
  80.   
  81. 0 1
  82.   
  83. 0 1
  84.   
  85. 0 1
  86.   
  87. 0 1
  88.   
  89. 1 1
  90.   
  91. 1 1
  92.   
  93. 1 1
  94.   
  95. 1 1
  96.   
  97. 1 1
  98.   
  99. 1 1
  100.   
  101. 1 1
  102.   
  103. 1 1
  104.   
  105. 1 1
  106.   
  107. 1 1
  108.   
  109. 1 1
  110.   
  111. 1 1
  112.   
  113. 1 1
  114.   
  115. 1 1
  116.   
  117. 1 1
  118.   
  119. 1 1
  120.   
  121. 1 1
  122.   
  123. 1 1
  124.   
  125. 1 1
  126.   
  127. 1 1
  128.   

0 个答案:

没有答案