小编use*_*363的帖子

每个模板实例化的 GCC/Clang 函数属性

我有一些手工向量化的 C++ 代码,我正在尝试通过函数多版本化制作可分发的二进制文件。由于代码对不同指令集(SSE2、AVX2、AVX512)使用 SIMD 内在函数,因此它使用模板专业化来决定使用哪些内在函数。

整体结构大致如下:

template <unsigned W, unsigned N> struct SIMD {};  // SIMD abstraction

template <> struct SIMD<128, 8> {  // specialization for specific dimensions
  using Vec = __m128i;
  static always_inline Vec add(Vec a, Vec b) { return _mm_add_epi8(a, b); }
  ...  // many other SIMD methods
};

... // many other dimension specializations for different instruction sets

template <unsigned W, unsigned N> class Worker {
  void doComputation(int x) {
    using S = SIMD<W, N>;
    ... // …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang template-specialization function-attributes

14
推荐指数
1
解决办法
562
查看次数

C中的原子递减和测试

我正在C中实现一个需要使用多个线程的引用计数系统.因此,我需要一种方法来减少整数引用计数,并测试一次原子操作结果是否为零.我可以使用C11 stdatomic.h,但似乎没有减量和测试操作.

这是最好的(即最便携的)方式吗?我可以使用这些stdatomic.h功能来实现吗?


这是引用计数(伪代码)的核心:

retain(object) {
    ++object.ref_count;  // pretty easy to make this atomic
} 

release(object) {
    if (--object.ref_count == 0)  // need this to be atomic also
        free(object)
}
Run Code Online (Sandbox Code Playgroud)

c atomic c11 stdatomic

7
推荐指数
1
解决办法
1019
查看次数