// Is 52 GB/s the wall? Compare our relu to a pure NT-copy (same 2N traffic = // the achievable read+write ceiling), and test transparent huge pages. 24 threads. #include #include #include #include #include #include #include #include static void relu_nt(float* __restrict o, const float* __restrict in, size_t n){ const __m256 z=_mm256_setzero_ps(); #pragma omp parallel for schedule(static) for(size_t j=0;j the read+write BW ceiling (2N traffic) static void copy_nt(float* __restrict o, const float* __restrict in, size_t n){ #pragma omp parallel for schedule(static) for(size_t j=0;j static double bw(F f,float*o,const float*in,size_t n,double gb){ for(int w=0;w<3;w++) f(o,in,n); double best=1e30; for(int r=0;r<10;r++){ auto a=std::chrono::high_resolution_clock::now(); f(o,in,n); auto b=std::chrono::high_resolution_clock::now(); best=std::min(best,std::chrono::duration(b-a).count()); } return gb/best; } int main(){ omp_set_num_threads(24); const size_t n=256ull*1024*1024, bytes=n*4; double gb=2.0*bytes/1e9; // plain float* in =(float*)aligned_alloc(64,bytes); float* out=(float*)aligned_alloc(64,bytes); for(size_t i=0;i