Сообщение Re: Очень быстрое заполнение матрицы (массива) от 26.01.2024 11:18
Изменено 26.01.2024 11:26 kov_serg
Re: Очень быстрое заполнение матрицы (массива)
Здравствуйте, Vladimir, Вы писали:
V>Есть матрица (массив) 10000х10000.
V>Заполнение всех элементов матрицы (m[i,j] = value) на моей машине выполняется 0.5 сек.
V>(Половина времени уходит на цикл for, половина на присвоение).
V>Можно ли как-то теоретически уменьшить скорость обработки?
Что у вас выводит такой код?
В сравнении со скорость памяти. Например:
V>Есть матрица (массив) 10000х10000.
V>Заполнение всех элементов матрицы (m[i,j] = value) на моей машине выполняется 0.5 сек.
V>(Половина времени уходит на цикл for, половина на присвоение).
V>Можно ли как-то теоретически уменьшить скорость обработки?
Что у вас выводит такой код?
// a.cpp
#include <chrono>
#include <iostream>
int main(int argc, char const *argv[]) {
std::chrono::steady_clock::time_point begin, end;
double dt, size, gb=1024*1024*1024;
enum { N=10000 };
double* x=new double[N*N]; if (!x) return 1;
size=N*N*sizeof(*x);
begin = std::chrono::steady_clock::now();
for(int i=0;i<N;i++) for(int j=0;j<N;j++) x[i*N+j]=0;
end = std::chrono::steady_clock::now();
dt=std::chrono::duration<double>(end-begin).count();
std::cout << "cold dt = " << std::chrono::duration_cast<std::chrono::milliseconds>(end-begin).count() << "[ms]";
std::cout << " speed=" << size/dt/gb << " Gb/s\n";
begin = std::chrono::steady_clock::now();
for(int i=0;i<N;i++) for(int j=0;j<N;j++) x[i*N+j]=0;
end = std::chrono::steady_clock::now();
dt=std::chrono::duration<double>(end-begin).count();
std::cout << "warm dt = " << std::chrono::duration_cast<std::chrono::milliseconds> (end - begin).count() << "[ms]";
std::cout << " speed=" << size/dt/gb << " Gb/s\n";
delete[] x;
return 0;
}g++ a.cpp -O3 && ./a.outВ сравнении со скорость памяти. Например:
2х канальной DDR3-1333 => 1.333*2*7.45 = 19.86 Gb/s
2х канальной DDR4-3200 => 3.200*2*7.45 = 47.68 Gb/s
2х канальной DDR5-7200 => 7.200*2*7.45/2 = 53.64 Gb/s
12х канальной DDR4-3000 => 3.000*12*7.45 = 268.20 Gb/sRe: Очень быстрое заполнение матрицы (массива)
Здравствуйте, Vladimir, Вы писали:
V>Есть матрица (массив) 10000х10000.
V>Заполнение всех элементов матрицы (m[i,j] = value) на моей машине выполняется 0.5 сек.
V>(Половина времени уходит на цикл for, половина на присвоение).
V>Можно ли как-то теоретически уменьшить скорость обработки?
Что у вас выводит такой код?
В сравнении со скоростью памяти. Например:
V>Есть матрица (массив) 10000х10000.
V>Заполнение всех элементов матрицы (m[i,j] = value) на моей машине выполняется 0.5 сек.
V>(Половина времени уходит на цикл for, половина на присвоение).
V>Можно ли как-то теоретически уменьшить скорость обработки?
Что у вас выводит такой код?
// a.cpp
#include <chrono>
#include <iostream>
int main(int argc, char const *argv[]) {
std::chrono::steady_clock::time_point begin, end;
double dt, size, gb=1024*1024*1024;
enum { N=10000 };
double* x=new double[N*N]; if (!x) return 1;
size=N*N*sizeof(*x);
begin = std::chrono::steady_clock::now();
for(int i=0;i<N;i++) for(int j=0;j<N;j++) x[i*N+j]=0;
end = std::chrono::steady_clock::now();
dt=std::chrono::duration<double>(end-begin).count();
std::cout << "cold dt = " << std::chrono::duration_cast<std::chrono::milliseconds>(end-begin).count() << "[ms]";
std::cout << " speed=" << size/dt/gb << " Gb/s\n";
begin = std::chrono::steady_clock::now();
for(int i=0;i<N;i++) for(int j=0;j<N;j++) x[i*N+j]=0;
end = std::chrono::steady_clock::now();
dt=std::chrono::duration<double>(end-begin).count();
std::cout << "warm dt = " << std::chrono::duration_cast<std::chrono::milliseconds> (end - begin).count() << "[ms]";
std::cout << " speed=" << size/dt/gb << " Gb/s\n";
delete[] x;
return 0;
}g++ a.cpp -O3 && ./a.outВ сравнении со скоростью памяти. Например:
2х канальной DDR3-1333 => 1.333*2*7.45 = 19.86 Gb/s
2х канальной DDR4-3200 => 3.200*2*7.45 = 47.68 Gb/s
2х канальной DDR5-7200 => 7.200*2*7.45/2 = 53.64 Gb/s
12х канальной DDR4-3000 => 3.000*12*7.45 = 268.20 Gb/s