gpt4 book ai didi

c++ - 为什么SSE和AVX的效率一样?

转载 作者:太空宇宙 更新时间:2023-11-04 16:19:43 26 4
gpt4 key购买 nike

我用的是vs2012,想测试一下SSE和AVX的效率。SSE和AVX的代码几乎一样,除了 SSE 使用 _m128 而 AVX 使用 _m256。我预计 AVX 代码比 SSE 代码快两倍,但测试结果显示它们的速度几乎相同。

我尝试选择/arch:AVX 或/arch:SSE 或/NOT SET并注释 SSE 代码或注释 AVX 代码,无论我测试什么,用于 SSE 代码的时间约为 2138ms,AVX 代码约为 2106ms。外层的for循环只是用来增加循环时间,

#include "testfun.h"
#include <iostream>
#include <time.h>
#include <malloc.h>
#include "immintrin.h"
using namespace std;
#define dataLen 800000

void testfun()
{
float *buf1 = reinterpret_cast<float*>(_aligned_malloc( sizeof(float)*dataLen, 32 ));
float *buf2 = reinterpret_cast<float*>(_aligned_malloc( sizeof(float)*dataLen, 32 ));
for(int i=0; i<dataLen; i++)
{
buf1[i] = 1;
buf2[i] = 1;
}
double timePassed;
int t = clock();
float sum = 0;
//=========================SSE CODE=====================================
__m128 *p1 = (__m128 *)buf1;
__m128 *p2 = (__m128 *)buf2;
__m128 _result = _mm_set_ps1(0.0f);

for(int j=0;j<10000; j++)
{
p1 = (__m128 *)buf1;
p2 = (__m128 *)buf2;
_result = _mm_sub_ps(_mm_set_ps(j,0,0,0) ,_result);

for(int i=0; i<dataLen/4; i++)
{
_result = _mm_add_ps(_mm_mul_ps(*p1, *p2), _result);
p1++;
p2++;
}
}

sum = _result.m128_f32[0]+_result.m128_f32[1]+_result.m128_f32[2]+_result.m128_f32[3];
timePassed = clock() - t;
std::cout<<std::fixed<<"SSE calculate result : "<<sum<<std::endl;
std::cout<<"SSE time used: "<<timePassed<<"ms"<<std::endl;

//=========================AVX CODE=====================================
t = clock();
__m256 *pp1 ;
__m256 *pp2 ;
__m256 _rresult = _mm256_setzero_ps();
sum = 0;

for(int j=0;j<10000; j++)
{
pp1 = (__m256*) buf1;
pp2 = (__m256*) buf2;
_rresult = _mm256_sub_ps(_mm256_set_ps(j,0,0,0,0,0,0,0), _rresult);

for(int i=0; i<dataLen/8; i++)
{
_rresult = _mm256_add_ps(_mm256_mul_ps(*pp1, *pp2), _rresult);
pp1++;
pp2++;
}
}

sum = _rresult.m256_f32[0]+_rresult.m256_f32[1]+_rresult.m256_f32[2]+_rresult.m256_f32[3]+_rresult.m256_f32[4]+_rresult.m256_f32[5]+_rresult.m256_f32[6]+_rresult.m256_f32[7];
timePassed = clock() - t;
std::cout<<std::fixed<<"AVX calculate result : "<<sum<<std::endl;
std::cout<<"AVX time used: "<<timePassed<<"ms"<<std::endl;

_aligned_free(buf1);
_aligned_free(buf2);

最佳答案

您很可能只是带宽受限,因为您的循环中只有两个算术指令并且有两个负载。如果您减小数据集的大小以使其适合缓存,那么您应该会看到性能上的差异(因为您将拥有更大的加载带宽并减少缓存加载的延迟)。

(此外,您的时间数字似乎非常高 - 确保您使用的是发布版本,即您启用了优化,否则您的结果会产生误导。)

关于c++ - 为什么SSE和AVX的效率一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18530516/

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