Любой способ реализовать атомарные функции с использованием барьеров в OpenCL? - PullRequest
2 голосов
/ 27 сентября 2019

У меня есть фрагмент кода, который использует atomic_inc, но, к сожалению, в поддержке OpenCL в FPGA Xilinx отсутствует элементарные функции.

Xilinx предлагает поддержку барьеров (и clk_global_mem_fence, и clk_local_mem_fence)

doВы знаете, пожалуйста, какой-нибудь способ заменить 'atomic_inc' в приведенном ниже коде в случае отсутствия атомарных функций?Могу ли я создать какую-то функцию, которая может использовать барьеры в OpenCL?

Большое спасибо

__attribute__((reqd_work_group_size(WORKSIZE, 1, 1)))
__kernel void search(__global hash_t* restrict hashes, __global uint* restrict output, const ulong target)
{
    uint gid = get_global_id(0);
    uint offset = get_global_offset(0);
    __global hash_t *hash = &(hashes[gid-offset]);

    bool result = (hash->h8[3] <= target);
    if (result) {
        // TODO(ajaraber): Disable atomic_inc as not available in Xilinx FPGAs
#ifdef ATOMIC_SUPPORTED
        uint i = atomic_inc(output + 0xFF);
#else
        uint i = atomicAdd(output+0xFF, 1);
#endif
        if (i < 0xFF)
            output[i] = SWAP4(gid);
    }

    // TODO(ajaraber): Use memory barrier but only for Xilinx FPGAs
#ifndef ATOMIC_SUPPORTED
    if (WORKSIZE != 1) {
        barrier(CLK_GLOBAL_MEM_FENCE);
    }
#endif
}
...