C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。
arques.hatenablog.com
符号付64ビット整数型
性能評価プログラム
C++で記述した関数と、アセンブリ言語で記述した関数を複数回呼び出します。それぞれに要した時間をclock関数で計測し、性能を評価します。common.hやアセンブリ言語で記述した関数は「抽出」で示したものと同じです。以降に、呼び出し側のソースリストを示します。
#include "..\common.h" // TEMPLATES #define T long long extern "C" { int extQLow (const T*, T*, const T, size_t); int extQHigh(const T*, T*, const T, size_t); int extQ (const T*, T*, const T, size_t, const T); } int main(void) { const size_t ArrLen = 32768; static_assert(ArrLen % 16 == 0, "number of elements must be an integral multiple of 16."); //T a[ArrLen], c[ArrLen], v[ArrLen]; const T low = -200, high = 5000; try { int cLen, aLen; T* a = (T*)_mm_malloc(sizeof(T) * ArrLen, 64); T* c = (T*)_mm_malloc(sizeof(T) * ArrLen, 64); T* v = (T*)_mm_malloc(sizeof(T) * ArrLen, 64); clock_t start; #define LOOPS 10000 init(a, ArrLen); cout << endl << "[ v < " << low << "]" << endl; start = clock(); for (int j = 0; j < LOOPS;j++) cLen = cextractLow(a, c, low, ArrLen); print_elTime("cpp: ", start, clock()); start = clock(); for (int j = 0; j < LOOPS;j++) aLen = extQLow (a, v, low, ArrLen); print_elTime("asm: ", start, clock()); verify(cLen, aLen, c, v, ArrLen); cout << endl << "[ v > " << high << "]" << endl; start = clock(); for (int j = 0; j < LOOPS;j++) cLen = cextractHigh(a, c, high, ArrLen); print_elTime("cpp: ", start, clock()); start = clock(); for (int j = 0; j < LOOPS;j++) aLen = extQHigh (a, v, high, ArrLen); print_elTime("asm: ", start, clock()); verify(cLen, aLen, c, v, ArrLen); cout << endl << "[ " << low << " < v < " << high << "]" << endl; start = clock(); for (int j = 0; j < LOOPS;j++) cLen = cextract(a, c, low, ArrLen, high); print_elTime("cpp: ", start, clock()); start = clock(); for (int j = 0; j < LOOPS;j++) aLen = extQ (a, v, low, ArrLen, high); print_elTime("asm: ", start, clock()); verify(cLen, aLen, c, v, ArrLen); _mm_free(v); _mm_free(c); _mm_free(a); } catch (char* str) { cerr << str << endl; } return 0; }
これまでと同様に、時間の計測を行います。上記プログラムへ /O2 オプションを指定してビルド&実行したときの性能を示します。
アセンブリ言語で開発した関数は、C++言語で開発した関数より約11.1倍から25.5倍高速です。データ依存がありそうで、値によってC++言語で記述した関数の処理時間は変動します。以降の性能評価も、データ依存があると考えて参考にしてください。