SSE加速實戰之 二階範數計算

2021-08-10 14:33:49 字數 1623 閱讀 3604

這裡使用了純c,sse c++加速版本,sse 彙編加速版本測試

求二維向量二階範數的計算:平方和求平方根

結果使用純c反而更快環境win10 + vs2013

結果是arraycalccpp 0.040ms

arraycalcsse 0.207ms

arraycalcsse2 0.208ms

arraycalcsseasm 0.207ms

使用編譯器優化的純c 比 手動寫的並行加速還要快5倍

void arraycalccpp(f32 *p1, f32 *p2, f32 *psum, s32 len)

}void arraycalcsse(f32 *p1, f32 *p2, f32 *psum, s32 len)

}void arraycalcsse2(f32 *p1, f32 *p2, f32 *psum, s32 len)

}void arraycalcsseasm(f32 *p1, f32 *p2, f32 *psum, s32 len)

}#define array_length 100000

void sse_test()

arraycalccpp(array1, array2, array3, array_length);

arraycalcsse(array1, array2, array4, array_length);

arraycalcsseasm(array1, array2, array5, array_length);

}void sse_testp()

double t;

t = (double)gettickcount();

for (int i = 0; i < cyc_num; i++)

t = ((double)gettickcount() - t) * 1000 / cyc_num / gettickfrequency();

printf("arraycalccpp %.3fms\n", t);

t = (double)gettickcount();

for (int i = 0; i < cyc_num; i++)

t = ((double)gettickcount() - t) * 1000 / cyc_num / gettickfrequency();

printf("arraycalcsse %.3fms\n", t);

t = (double)gettickcount();

for (int i = 0; i < cyc_num; i++)

t = ((double)gettickcount() - t) * 1000 / cyc_num / gettickfrequency();

printf("arraycalcsse2 %.3fms\n", t);

t = (double)gettickcount();

for (int i = 0; i < cyc_num; i++)

t = ((double)gettickcount() - t) * 1000 / cyc_num / gettickfrequency();

printf("arraycalcsseasm %.3fms\n", t);

}

SSE指令集系列之二

4.資料重排指令集 unpckhps xmm,xmm m128 源儲存器與目的暫存器高64位按雙字交錯排列,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.高64位 低64位 目的暫存器 a0 a1 a2 a3 源儲存器 b0 b1 b2 b3 目的暫存器結果 b0 a0 b1 a1 例 當...

epoll之二 epoll實戰

int epoll create int size epoll create返回 乙個控制代碼,之後epoll的 使用都將依靠這個 控制代碼 來 標識,引數 size是告訴epoll所要處理的大致事件數目,不再使用epoll時,必須呼叫close 關閉這個控制代碼。size這個引數只是 告訴核心這個...

阿里雲實戰之二 mysql phpmyadmin

首先用探針測試mysql環境是否可用,然後我不幸的發現自己忘記mysql密碼了,汗乙個。如下的方法可解決密碼丟失問題 1.修改mysql的配置檔案 預設為 etc my.cnf 在 mysqld 下新增一行skip grant tables 2.儲存配置檔案後,重啟mysql服務 service m...