Я обнаружил, что иметь много маленьких 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];
}