2013-07-25 48 views
0

感谢你们中的一些人,我已经使用了SSE来加速计算我的科学应用程序的功能之一C++ use SSE instructions for comparing huge vectors of intsC++ 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做我需要编写自定义矢量分配整个代码?有更简单的选择吗?

我需要你的帮助。在此先感谢

回答

1

有几件事情可以做,以提高表演了一下:

  • 采取__m128i v1, v2, vmax;圈外的,但是这是最有可能由编译器完成
  • 确保距离是正确的对齐
  • 而不是使用std :: vector,对齐数据并传递指针。然后使用_mm_load_si128

如果距离和goalNodeIdTemp正确对齐,则可以使用原始指针。事情是这样的:

__m128i *v1 = (__m128i *) & distances[positionNodeId + k]; 
__m128i *v2 = (__m128i *) & goalNodeIdTemp[k]; 

所有进一步的优化,你需要寻找到汇编代码。


你相信我能得到一个更好的速度了,如果两个:1)阵列的距离对准B)矢量goalNodeIdTemp对齐

是的,你会得到一个小的性能提升。没有什么特别的,但如果每个周期都计数,那么它可能是显而易见的

我该怎么做?

要有goalNodeIdTemp对齐,你必须使用一个特殊的分配的std::vector(参见例如here如何做到这一点)。

要对齐distance,您必须小心。请参阅here如何分配对齐的内存。

+0

a)已完成b)(确保距离正确对齐)我不知道该怎么做(这是原始问题)c)我也不知道如何做到这一点 – Alexandros

+0

@AlexandrosE。好的,对不起。我错过了这些问题。我会编辑我的答案 –