使用/不使用c++内部函数填充
Fill with/without intrinsics C++
我正在研究内在函数对性能的影响,我有点困惑:它们似乎根本没有影响!我试着用两个不同的函数填充一个双精度数组,我看不出有什么不同。我通过调用_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缓存的大内存区域时)
相关文章:
- C++ SSE 内部函数:将结果存储在变量中
- C++代码停止工作错误使用cout内部函数
- 为什么从具有较大阵列的 SIMD 内部函数中获得的相对加速比标量更大?
- 使用英特尔内部函数 (AVX) 中的混合说明
- 英特尔汇编与内部函数,AVX
- 使用SSE内部函数复制少量数据时出现问题
- 在为函数编写单元测试时,我应该模拟所做的内部函数调用吗?
- 用于平铺矩阵乘法的 AVX 内部函数
- 是否可以使用类的析构函数内部函数来重置值?
- 我在理解 AVX 随机内部函数如何为 8 位时遇到一些问题
- 无法执行内部函数 strlen
- COUT 内部函数调用的顺序
- GCC(通过 CUDA)内部函数的编译器错误,但我没有使用任何
- C++ ld 链接器 --wrap 选项不适用于内部函数调用
- 通过Visual Studio将小型结构逐值传递到非内部函数的速度很慢
- 使用内部函数递增数组的特定元素
- 在使用英特尔内部函数对 SIMD 代码进行编程时,如何强制使用 vmovapd 而不是 vmovupd?
- 如何最大限度地减少使用标量 SIMD 内部函数的 SIMD 注册表的双重负载开销
- 有符号整数溢出、内部函数和未定义的行为
- SSE2 内部函数 - 找到两个无符号短向量的最大值