gpt4 book ai didi

C++ 快速将 2 个数组相加

转载 作者:可可西里 更新时间:2023-11-01 18:09:48 26 4
gpt4 key购买 nike

给定数组:

int canvas[10][10];
int addon[10][10];

所有值的范围都在 0 - 100 之间,在 C++ 中添加这两个数组的最快方法是什么,以便 Canvas 中的每个单元格等于自身加上插件中相应的单元格值?

IE,我想实现类似的东西:

canvas += another;

所以如果 canvas[0][0] =3 并且 addon[0][0] = 2 那么 canvas[0][0] = 5

速度在这里很重要,因为我正在编写一个非常简单的程序来暴力破解背包类型的问题,并且会有数千万种组合。

作为一个额外的小问题(如果您能提供帮助,谢谢!)检查 Canvas 中的任何值是否超过 100 的最快方法是什么?循环很慢!

最佳答案

这是一个 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

关于C++ 快速将 2 个数组相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2959476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com