这篇文章与我几天前发布的另一篇文章密切相关.这一次,我编写了一个简单的代码,它只添加了一对元素数组,将结果乘以另一个数组中的值并将其存储在第四个数组中,所有变量浮点数都是双精度类型.
我制作了两个版本的代码:一个是SSE指令,使用调用而另一个没有它我然后使用gcc和-O0优化级别编译它们.我在下面写下:
// SSE VERSION
#define N 10000
#define NTIMES 100000
#include <time.h>
#include <stdio.h>
#include <xmmintrin.h>
#include <pmmintrin.h>
double a[N] __attribute__((aligned(16)));
double b[N] __attribute__((aligned(16)));
double c[N] __attribute__((aligned(16)));
double r[N] __attribute__((aligned(16)));
int main(void){
int i, times;
for( times = 0; times < NTIMES; times++ ){
for( i = 0; i <N; i+= 2){
__m128d mm_a = _mm_load_pd( &a[i] );
_mm_prefetch( &a[i+4], _MM_HINT_T0 );
__m128d mm_b = _mm_load_pd( &b[i] );
_mm_prefetch( &b[i+4] , _MM_HINT_T0 );
__m128d mm_c = _mm_load_pd( …Run Code Online (Sandbox Code Playgroud) 我曾经_rdtsc()时间atoi()和atof()我注意到他们花了很长时间.因此,我编写了自己的这些函数版本,这些函数从第一次调用开始就快得多.
我使用的是Windows 7,VS2012 IDE,但使用的是英特尔C/C++编译器v13.我有 - /O3启用,还有 - /Ot("赞成快速代码").我的CPU是常春藤桥(移动).
经进一步调查,似乎更多的时间atoi()和atof()被称为越快他们执行?我说话的速度更快:
当我atoi()从我的循环外部调用时,只需要一次,它需要5,892个CPU周期,但经过数千次迭代后,这减少到300 - 600个CPU周期(相当大的执行时间范围).
atof() 最初需要20,000到30,000个CPU周期,然后在几千次迭代之后需要18到28个CPU周期(这是我的自定义函数第一次调用时的速度).
有人可以解释这个效果吗?
编辑:忘了说 - 我的程序的基本设置是从文件解析字节的循环.在循环中我明显使用我的atof和atoi来注意上面的内容.然而,我还注意到,当我在循环之前进行调查时,只需调用atoi和atof两次,以及两次用户编写的等效函数,它似乎使循环执行得更快.循环处理了150,000行数据,每行需要3x atof()或atoi()s.再一次,我无法理解为什么在我的主循环之前调用这些函数会影响调用这些函数500,000次的程序的速度?!
#include <ia32intrin.h>
int main(){
//call myatoi() and time it
//call atoi() and time it
//call myatoi() and time it
//call atoi() and time it
char* bytes2 = "45632";
_int64 start2 = _rdtsc();
unsigned int a2 = atoi(bytes2);
_int64 finish2 = _rdtsc();
cout << (finish2 - start2) …Run Code Online (Sandbox Code Playgroud) 这是我的代码汇编程序
你能用c ++嵌入它并检查SSE4吗?速度快
我非常希望看到如何进入SSE4的发展.或者根本不担心他?我们检查一下(我没有SSSE3以上的支持)
{ sse2 strcmp WideChar 32 bit }
function CmpSee2(const P1, P2: Pointer; len: Integer): Boolean;
asm
push ebx // Create ebx
cmp EAX, EDX // Str = Str2
je @@true // to exit true
test eax, eax // not Str
je @@false // to exit false
test edx, edx // not Str2
je @@false // to exit false
sub edx, eax // Str2 := Str2 - Str;
mov ebx, [eax] // get Str 4 byte
xor …Run Code Online (Sandbox Code Playgroud) c ×2
optimization ×2
sse ×2
assembly ×1
c++ ×1
caching ×1
hpc ×1
performance ×1
sse4 ×1
x86 ×1