使用/不使用c++内部函数填充

Fill with/without intrinsics C++

本文关键字:c++ 内部函数 填充 使用      更新时间:2023-10-16

我正在研究内在函数对性能的影响,我有点困惑:它们似乎根本没有影响!我试着用两个不同的函数填充一个双精度数组,我看不出有什么不同。我通过调用_aligned_malloc来分配数组,对齐参数设置为8。我使用Visual Studio 2008,并在发布模式下编译,有和没有优化(/O2 -/Od),有和没有内在(/Oi) -所有四种组合。下面是两个不同的版本:

#ifdef _NO_INTRIN
void my_fill(double* vett, double value, int N)
{
    double* last = vett + N;
    while( vett != last)
    {
        *vett++ = value;
    }
}
#else
void my_fill(double* vett, double value, int N)
{
    double* last = vett + N;
    // set "classically" unaligned data, if any
    while( (0xF & (uintptr_t)vett) && vett != last )
        *vett++ = value;
    __m128d* vett_ = (__m128d*)vett;
    uintptr_t fff0 = ~0 << 4;
    // round address to nearest aligned data setting to zero least significant 4 bits
    __m128d* last_ = (__m128d*)( fff0 & (uintptr_t)last);
    // process until second-last element to manage odd values of N
    for( ; vett_ < last_-1; vett_++ )
    {
        *vett_ = _mm_set1_pd(value);
    }
    vett = (double*)vett_;
    while(vett != last)
        *vett++ = value;
}    
#endif

作为最后一个规范,我将数据对齐到8B而不是16,因为我计划在数组的不同部分以多线程的方式执行这个函数。所以,也将数据对齐到16B,我不能确定数组的所有部分将被对齐。303个元素,3个线程,每个线程101个元素,第一部分对齐到16B,第二部分开始@ vett+101*8 ==>未对齐)。这就是为什么我试图实现一个与对齐无关的函数。我试图在我的英特尔Atom CPU N570 @ 1.66 GHz上填充1M元素的数组,我总是得到相同的执行时间。所以…我的方法有什么问题吗?为什么我看不出有什么不同?提前感谢大家。

如果您不进行任何复杂的计算,而只是将固定值写入内存,那么您的程序速度可能会受到内存带宽的限制。CPU可以在内部以更快的速度生成值,但它受限于它可以将它们传输到RAM的速率(特别是当处理不适合CPU缓存的大内存区域时)