ビット演算
■ このスレッドは過去ログ倉庫に格納されています
0302∀<)っ-●○◎- ◆Pu/ODYSSEY
2006/01/17(火) 17:59:55あー、16byte境界にあわせてあること前提ね。
#include <altivec.h>
void vQuickSort(int e[8]) {
register vector int v1, v2, v3, v4;
v1 = *((vector int)&e[0]); // lvx
v2 = *((vector int)&e[4]); // lvx
v3 = vec_max(v1, v2); // vmaxsw
v4 = vec_min(v1, v2); // vmaxsw
v1 = vec_mergeh(v3, v4); // vmrghw
v2 = vec_mergel(v3, v4); // vmrglw
v3 = vec_max(v1, v2); // vmaxsw
v4 = vec_min(v1, v2); // vmaxsw
v1 = vec_mergeh(v3, v4); // vmrghw
v2 = vec_mergel(v3, v4); // vmrglw
v3 = vec_max(v1, v2); // vmaxsw
v4 = vec_min(v1, v2); // vmaxsw
v1 = vec_mergeh(v3, v4); // vmrghw
v2 = vec_mergel(v3, v4); // vmrglw
*((vector int)&e[0]) = v1; // stvx
*((vector int)&e[4]) = v2; // stvx
}
たった16オペレーションで済む。ちなみに8bit×32要素なら24オペレーション。
ただ、依存関係があるから並列実行性能はそんなに良くない。
VSIUとVPERMはMPC7400/7450, PPC970いずれでも並列動作可能だが
このコードの場合どこにも並列化可能なところがない。
ただし要素数がもっと増えれば、たとえば4byte×16とかなら並列化は有効。
■ このスレッドは過去ログ倉庫に格納されています