Информация об изменениях

Сообщение Re: Очень быстрое заполнение матрицы (массива) от 26.01.2024 11:18

Изменено 26.01.2024 11:24 kov_serg

Re: Очень быстрое заполнение матрицы (массива)
Здравствуйте, Vladimir, Вы писали:

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
Re: Очень быстрое заполнение матрицы (массива)
Здравствуйте, Vladimir, Вы писали:

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