У меня есть фрагмент кода, который использует 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
}