vDSPの内積計算がどのくらい速いのか検証してみました。
#ifdef __APPLE__ #include <Accelerate/Accelerate.h> #endif int main(int argc, const char * argv[]) { float* a = new float[4096]; float* b = new float[4096]; float* c = new float; for (int i = 0; i < 4096; ++i) { a[i] = (float)i / 4096.f; b[i] = (float)i / 4096.f; } const auto t1 = std::chrono::system_clock::now(); for (int i = 0; i < 4096; ++i) { #if 0 vDSP_dotpr(a, 1, b, 1, c, 4096); #elif SSE // omit #elif AVX // omit #else *c = 0; float* p = a; float* q = b; const float* end = p + 4096; while (p != end) { *c += *(p++) * *(q++); } #endif } const auto t2 = std::chrono::system_clock::now(); double elapsed = std::chrono::duration_cast<std::chrono::microseconds>(t2-t1).count(); printf("%f\n", elapsed); // M1 -ONone(最適化なし) : 58482 us // M1 -Os(最適化) : 6023 us // M1 vDSP: 975 us // Intel /Od(最適化なし) : 30764 us // Intel /Ox(最適化) : 7521 us // Intel SSE: 3578 us // Intel AVX256: 851 us printf("%f\n", *c); delete [] a; delete [] b; delete c; return 0; }
Intelは第12世代IntelCPUで動作するWindowsマシンを使いました。
M1はM1 Pro CPUです。
vDSPはIntelCPUでAVX命令を使ったときと同じくらいの速度が出るということがわかりました。
追加で内積以外の結果もみてみました。
M1 vDSP_conv: 123ms
M1 -Os: 2182ms