这是一个 SSE4 实现,应该在 Nehalem (Core i7) 上表现良好:
#include <limits.h>
#include <emmintrin.h>
#include <smmintrin.h>
static inline int canvas_add(int canvas[10][10], int addon[10][10])
{
__m128i * cp = (__m128i *)&canvas[0][0];
const __m128i * ap = (__m128i *)&addon[0][0];
const __m128i vlimit = _mm_set1_epi32(100);
__m128i vmax = _mm_set1_epi32(INT_MIN);
__m128i vcmp;
int cmp;
int i;
for (i = 0; i < 10 * 10; i += 4)
{
__m128i vc = _mm_loadu_si128(cp);
__m128i va = _mm_loadu_si128(ap);
vc = _mm_add_epi32(vc, va);
vmax = _mm_max_epi32(vmax, vc); // SSE4 *
_mm_storeu_si128(cp, vc);
cp++;
ap++;
}
vcmp = _mm_cmpgt_epi32(vmax, vlimit); // SSE4 *
cmp = _mm_testz_si128(vcmp, vcmp); // SSE4 *
return cmp == 0;
}
gcc -msse4.1 ...
为您的特定开发环境编译或等效。
对于没有 SSE4 的旧 CPU(以及更昂贵的未对齐加载/存储),您需要 (a) 使用 SSE2/SSE3 内在函数的合适组合来替换 SSE4 操作(标有*
上述),理想情况下 (b) 使确保您的数据是 16 字节对齐的,并使用对齐的加载/存储 ( _mm_load_si128
/ _mm_store_si128
) 代替_mm_loadu_si128
/ _mm_storeu_si128
。