我有一些手工向量化的 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中实现一个需要使用多个线程的引用计数系统.因此,我需要一种方法来减少整数引用计数,并测试一次原子操作结果是否为零.我可以使用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)