gpt4 book ai didi

c++ - 使用 SSE 加速计算——存储、加载和对齐

转载 作者:可可西里 更新时间:2023-11-01 17:24:00 25 4
gpt4 key购买 nike

在我的项目中,我实现了基本类 CVector。此类包含指向原始 float 组的 float* 指针。该数组是使用标准 malloc() 函数动态分配的。

现在我必须使用这样的 vector 来加速一些计算。不幸的是,由于未使用 _mm_malloc() 分配内存,因此未对齐。

据我所知,我有两个选择:

1) 重写分配内存以使用 _mm_malloc() 的代码,例如使用如下代码:

void sub(float* v1, float* v2, float* v3, int size) 
{
__m128* p_v1 = (__m128*)v1;
__m128* p_v2 = (__m128*)v2;
__m128 res;

for(int i = 0; i < size/4; ++i)
{
res = _mm_sub_ps(*p_v1,*p_v2);
_mm_store_ps(v3,res);
++p_v1;
++p_v2;
v3 += 4;
}
}

2) 第二种选择是使用 _mm_loadu_ps() 指令从未对齐的内存中加载 __m128,然后将其用于计算。

void sub(float* v1, float* v2, float* v3, int size)
{
__m128 p_v1;
__m128 p_v2;
__m128 res;

for(int i = 0; i < size/4; ++i)
{
p_v1 = _mm_loadu_ps(v1);
p_v2 = _mm_loadu_ps(v2);
res = _mm_sub_ps(p_v1,p_v2);
_mm_store_ps(v3,res);
v1 += 4;
v2 += 4;
v3 += 4;
}
}

所以我的问题是哪个选项会更好或更快?

最佳答案

读取未对齐的 SSE 值非常昂贵。查看 Intel 手册,第 4 卷,第 2.2.5.1 章。核心类型有所不同,i7 具有额外的硬件以降低成本。但是读取跨越 cpu 缓存行边界的值仍然比读取对齐值慢 4.5 倍。它比以前的架构慢 10 倍。

这是巨大的,对齐内存以避免性能命中。从未听说过 _mm_malloc,使用 Microsoft CRT 中的 _aligned_malloc() 从堆中获取正确对齐的内存。

关于c++ - 使用 SSE 加速计算——存储、加载和对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5118158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com