感谢你们中的一些人,我已经使用了SSE来加速计算我的科学应用程序的功能之一C++ use SSE instructions for comparing huge vectors of ints。C++ SSE以及整数和整数向量的对齐阵列
优化SSE函数的最终版本是:
int getBestDiffsSse(int nodeId, const vector<int> &goalNodeIdTemp) {
int positionNodeId = 2 * nodeId * nof;
int myNewIndex = 2 * nof;
int result[4] __attribute__((aligned(16))) = {0};
__m128i vresult = _mm_set1_epi32(0);
__m128i v1, v2, vmax;
for (int k = 0; k < myNewIndex; k += 4) {
v1 = _mm_loadu_si128((__m128i *) & distances[positionNodeId + k]);
v2 = _mm_loadu_si128((__m128i *) & goalNodeIdTemp[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]);
}
其中
const __m128i vke = _mm_set_epi32(0, -1, 0, -1);
const __m128i vko = _mm_set_epi32(-1, 0, -1, 0);
和
int* distances
distances= new int[size];
其中大小是巨大的(18M×64)
我天真的问题是:你相信我可以得到更好的加速,如果两者:a)阵列距离对齐或b)向量goalNodeIdTemp对齐,并且c)我该怎么做?
我看过一些关于memalign或align_malloc的帖子,但我不明白如何将它们用于动态数组或矢量。或者因为我在谈论整数,对齐不是一个问题?请记住,我使用的是Ubuntu 12.04和gcc,因此有关Visual Studio编译器的解决方案不是一种选择。
添加的问题:首先,下面的代码足以对齐动态数组(请记住,定义和初始化必须保持不同);
int *distances __attribute__((aligned(16)));
distances = new int[size];
其次,为了对准矢量goalNodeIdTemp做我需要编写自定义矢量分配整个代码?有更简单的选择吗?
我需要你的帮助。在此先感谢
a)已完成b)(确保距离正确对齐)我不知道该怎么做(这是原始问题)c)我也不知道如何做到这一点 – Alexandros
@AlexandrosE。好的,对不起。我错过了这些问题。我会编辑我的答案 –