почему много маленьких memcpy быстрее, чем одно большое memcpy? - PullRequest
0 голосов
/ 07 мая 2018

Я обнаружил, что иметь много маленьких memcpy быстрее, чем иметь один большой memcpy.Я не могу понять, почему это так.Разве memcpy лучше не копирует большой блок данных?

Я протестировал следующий код на VC ++ 2017 и компиляторе Intel 2018.

время для одного большого memcpy: 0,457913 и времядля многих маленьких memcpy: 0.121063

typedef double tp;
size_t sz = 100;
size_t nm = 1000000;
tp* x = new tp[sz*nm];
std::vector<tp*> y(nm);
for (int i = 0; i < nm; ++i)
   y[i] = new tp[sz];

tp*  z1 = new tp[sz*nm];
std::vector<tp*> z2(nm);
for (int i = 0; i < nm; ++i)
   z2[i] = new tp[sz];

double currTime, lastTime;

lastTime = omp_get_wtime();
memcpy((void*)z1, (void*)x, sizeof(tp)*sz*nm);
currTime = omp_get_wtime();
std::cout << "time for one large memcpy: " << currTime - lastTime << std::endl;

lastTime = omp_get_wtime();
for (int i = 0; i < nm; ++i)
    memcpy((void*)z2[i], (void*)y[i], sizeof(tp)*sz);
currTime = omp_get_wtime();
std::cout << "time for many small memcpy: " << currTime - lastTime << std::endl;

delete[] x;
delete[] z1;
for (int i = 0; i < nm; ++i)
{
   delete[] y[i];
   delete[] z2[i];
}
...