c++ - 使用/不使用内在函数填充 C++

标签 c++ c alignment intrinsics

我正在研究内在函数对性能的影响,我有点困惑:它们似乎根本没有影响!我试图用两个不同的函数填充 double 组,但我看不出有什么区别。我通过调用 _aligned_malloc 并将对齐参数设置为 8 来分配数组。我使用 Visual Studio 2008,并在 Release模式下进行编译,无论有没有优化 (/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 个元素,第 1 部分对齐到 16B,第 2 部分从 @ vett+101 开始*8 ==> 未对齐)。这就是为什么我尝试实现与对齐无关的函数。 我尝试在 Intel Atom CPU N570 @ 1.66 GHz 上填充 1M 元素的数组,并且执行时间始终相同。那么...我的方法有什么问题吗?为什么我没有看到任何差异?提前谢谢大家。

最佳答案

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

关于c++ - 使用/不使用内在函数填充 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14092297/

相关文章:

c# - 如何将结构从 C++ 迁移到 C#

c++ - 包含类文件后的错误消息(多个定义的符号)

c++ - 在启动另一个计时器之前等待 20 秒的非阻塞计时器

excel - 我想在excel的单元格中对齐/居中图像

xml - 使 gtk 小部件填充父窗口

c++ - 对两个 QVector 进行排序

c - 我怎样才能读取和处理这种文件

c - Openssl如何找出X509证书中公钥的位大小是多少

c - 为什么“while(!feof(file))”总是错误的?

css - 如何对齐两张不同卡片中的元素