gpt4 book ai didi

C++ 使用 SSE 指令比较巨大的整数 vector

转载 作者:可可西里 更新时间:2023-11-01 15:49:11 29 4
gpt4 key购买 nike

我有一个巨大的vector<vector<int>> (18M x 128)。我经常想取这个 vector 的 2 行并通过这个函数比较它们:

    int getDiff(int indx1, int indx2) {
int result = 0;
int pplus, pminus, tmp;

for (int k = 0; k < 128; k += 2) {
pplus = nodeL[indx2][k] - nodeL[indx1][k];
pminus = nodeL[indx1][k + 1] - nodeL[indx2][k + 1];

tmp = max(pplus, pminus);
if (tmp > result) {
result = tmp;
}
}
return result;
}

如您所见,该函数循环遍历两个行 vector 并执行一些减法操作,最后返回最大值。这个函数会被使用一百万次,所以我想知道是否可以通过 SSE 指令加速它。我使用 Ubuntu 12.04 和 gcc。

当然这是微优化,但如果您能提供一些帮助,那将很有帮助,因为我对 SSE 一无所知。提前致谢

基准:

    int nofTestCases = 10000000;

vector<int> nodeIds(nofTestCases);
vector<int> goalNodeIds(nofTestCases);
vector<int> results(nofTestCases);

for (int l = 0; l < nofTestCases; l++) {
nodeIds[l] = randomNodeID(18000000);
goalNodeIds[l] = randomNodeID(18000000);
}



double time, result;

time = timestamp();
for (int l = 0; l < nofTestCases; l++) {
results[l] = getDiff2(nodeIds[l], goalNodeIds[l]);
}
result = timestamp() - time;
cout << result / nofTestCases << "s" << endl;

time = timestamp();
for (int l = 0; l < nofTestCases; l++) {
results[l] = getDiff(nodeIds[l], goalNodeIds[l]);
}
result = timestamp() - time;
cout << result / nofTestCases << "s" << endl;

在哪里

int randomNodeID(int n) {
return (int) (rand() / (double) (RAND_MAX + 1.0) * n);
}

/** Returns a timestamp ('now') in seconds (incl. a fractional part). */
inline double timestamp() {
struct timeval tp;
gettimeofday(&tp, NULL);
return double(tp.tv_sec) + tp.tv_usec / 1000000.;
}

最佳答案

FWIW 我整理了一个纯 SSE 版本 (SSE4.1),它似乎比 Core i7 上的原始标量代码快 20% 左右:

#include <smmintrin.h>

int getDiff_SSE(int indx1, int indx2)
{
int result[4] __attribute__ ((aligned(16))) = { 0 };

const int * const p1 = &nodeL[indx1][0];
const int * const p2 = &nodeL[indx2][0];

const __m128i vke = _mm_set_epi32(0, -1, 0, -1);
const __m128i vko = _mm_set_epi32(-1, 0, -1, 0);

__m128i vresult = _mm_set1_epi32(0);

for (int k = 0; k < 128; k += 4)
{
__m128i v1, v2, vmax;

v1 = _mm_loadu_si128((__m128i *)&p1[k]);
v2 = _mm_loadu_si128((__m128i *)&p2[k]);
v1 = _mm_xor_si128(v1, vke);
v2 = _mm_xor_si128(v2, vko);
v1 = _mm_sub_epi32(v1, vke);
v2 = _mm_sub_epi32(v2, vko);
vmax = _mm_add_epi32(v1, v2);
vresult = _mm_max_epi32(vresult, vmax);
}
_mm_store_si128((__m128i *)result, vresult);
return max(max(max(result[0], result[1]), result[2]), result[3]);
}

关于C++ 使用 SSE 指令比较巨大的整数 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17791892/

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