0

我一直在关注教程,除了最后一个关于如何创建信号量的示例对我不起作用之外,它一直都很棒。逻辑相当简单,但我无法弄清楚为什么这个内核会导致无限循环。

我的内核.cl

#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
void GetSemaphor(__global int * semaphor, __global int * data) {
   int occupied = atom_xchg(semaphor, 1);
   int realityCheck = 0;
   while(occupied == 1 && realityCheck++ < 100000)
        occupied = atom_xchg(semaphor, 1);
}

void ReleaseSemaphor(__global int * semaphor)
{
   int prevVal = atom_xchg(semaphor, 0);
}

__kernel void myKernel(__global int* data, __global int* semaphor)
{
    // semaphor[0] is set to 0 on the host.
    GetSemaphor(&semaphor[0], data);
    data[0]++;
    ReleaseSemaphor(&semaphor[0]);
}

这是与:

OpenCL 1.2

FULL_PROFILE

在 Quadro NVS 290 上

*cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics

4

1 回答 1

2

你引用的那个教程是错误的,永远不会在 GPU 设备上工作。由于硬件架构。

任何阻止工作组内工作项的同步机制都将根本不起作用。由于阻塞状态会影响整个工作组,产生无限循环。

您只能在工作组大小为 1 或跨工作组的情况下执行此类操作。

于 2013-09-28T07:58:19.817 回答