感谢你们中的一些人,我已经使用 SSE 来加速计算我在C++ 中的科学应用程序的一项功能,使用 SSE 指令来比较巨大的 ints 向量。
优化后的 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 x 64)
我的天真问题是:如果以下两种情况都对齐,您是否相信我可以获得更好的加速:a)数组距离对齐或 b)向量 goalNodeIdTemp 对齐和 c)我该怎么做?
我看过一些关于 memalign 或 align_malloc 的帖子,但我不明白如何将它们用于动态数组或向量。还是因为我在谈论整数,所以对齐不是问题?请记住,我使用的是 Ubuntu 12.04 和 gcc,因此不能选择有关 Visual Studio 编译器的解决方案。
添加的问题:首先,以下代码是否足以对齐动态数组(请记住,定义和初始化必须保持不同);
int *distances __attribute__((aligned(16)));
distances = new int[size];
其次,为了对齐向量goalNodeIdTemp,我需要为自定义向量分配器编写整个代码吗?有没有更简单的选择?
我需要你的帮助。提前致谢