А в памяти моей такая скрыта мощь...

User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: А в памяти моей такая скрыта мощь...

Post by Dmitry67 »

fleshold wrote: 14 Feb 2018 08:22
Dmitry67 wrote: 13 Feb 2018 12:28 На самом деле чем больше память, тем важнее писать cache-friendly code

Например, производительность двух фрагментов кода ниже отличается в 20 раз примерно:

Code: Select all

int sum = 0;
for (int i=0; i<10000; i++)
  for (int j=0; j<10000; j++)
    sum += A[i,j];

Code: Select all

int sum = 0;
for (int i=0; i<10000; i++)
  for (int j=0; j<10000; j++)
    sum += A[j,i];
Ну точно не в 20, а наверное раза в полтора, ну может в 2. A[i,j]? Что за языг?
хоть C#, хоть C, хоть C++
Или уже выросло поколение которое пишет только A[j]?
Матриц на вас нет!)))

разница 15-20 раз - вы ее не дооцениваете.
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: А в памяти моей такая скрыта мощь...

Post by OtherSide »

в смысле. В c/с++ только одномерные массивы
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: А в памяти моей такая скрыта мощь...

Post by Dmitry67 »

OtherSide wrote: 14 Feb 2018 09:56 в смысле. В c/с++ только одномерные массивы
Значит с фортраном перепутал)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
tessob
Уже с Приветом
Posts: 576
Joined: 07 Jan 2016 13:04

Re: А в памяти моей такая скрыта мощь...

Post by tessob »

fleshold wrote: 14 Feb 2018 08:22Ну точно не в 20, а наверное раза в полтора, ну может в 2.
Я вообще не понимаю почему должна возникнуть даже двукратная разница. У нас же по идее при аллокации памяти под n-мерный массив сразу должна выделяться вся память. Соответственно, при изменении значения одного из элементов нам просто нужно найти указатель на первую ячейку в выделенном пространстве. Чего я упускаю?
fleshold
Уже с Приветом
Posts: 145
Joined: 29 Apr 2014 12:22

Re: А в памяти моей такая скрыта мощь...

Post by fleshold »

Dmitry67 wrote: 14 Feb 2018 09:52
fleshold wrote: 14 Feb 2018 08:22
Dmitry67 wrote: 13 Feb 2018 12:28 На самом деле чем больше память, тем важнее писать cache-friendly code

Например, производительность двух фрагментов кода ниже отличается в 20 раз примерно:

Code: Select all

int sum = 0;
for (int i=0; i<10000; i++)
  for (int j=0; j<10000; j++)
    sum += A[i,j];

Code: Select all

int sum = 0;
for (int i=0; i<10000; i++)
  for (int j=0; j<10000; j++)
    sum += A[j,i];
Ну точно не в 20, а наверное раза в полтора, ну может в 2. A[i,j]? Что за языг?
хоть C#, хоть C, хоть C++
Или уже выросло поколение которое пишет только A[j]?
Матриц на вас нет!)))

разница 15-20 раз - вы ее не дооцениваете.


Comma в языке C++ sequencing оператор.
10000*10000*4 примерно 380 метров. Проверить, так то несложно. Да и не стал бы я палиться написав сообщение что то недооценив. В случае

Code: Select all

A[i][j]
будет крутиться где то около секунды, допустим 777 мс, в случае

Code: Select all

A[j][i]
около двух, гдето 1666 мс. difftime() моментов до и после цикла выдаст 0 и 1 секунду соответственно. Неважно, хоть глобальной объяви A, хоть в кучу (локальной не получится). Не будет в 20 раз по любому.
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: А в памяти моей такая скрыта мощь...

Post by Dmitry67 »

https://www2.cs.duke.edu/courses/cps104 ... he-sw2.pdf

См страницу 10
Правда там чуть другой пример с перемножением матриц
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: А в памяти моей такая скрыта мощь...

Post by Dmitry67 »

Кстати задумался

В C# тоже есть оператор запятая
Но есть и двумерные массивы
Налицо двусмысленность синтаксиса
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
fleshold
Уже с Приветом
Posts: 145
Joined: 29 Apr 2014 12:22

Re: А в памяти моей такая скрыта мощь...

Post by fleshold »

tessob wrote: 14 Feb 2018 11:41
fleshold wrote: 14 Feb 2018 08:22Ну точно не в 20, а наверное раза в полтора, ну может в 2.
Я вообще не понимаю почему должна возникнуть даже двукратная разница. У нас же по идее при аллокации памяти под n-мерный массив сразу должна выделяться вся память. Соответственно, при изменении значения одного из элементов нам просто нужно найти указатель на первую ячейку в выделенном пространстве. Чего я упускаю?
Это как бы школьная программа :oops: , как в памяти массивы располагаются и что последовательно друг за другом их элементы читать "быстрее". В первом случае читаем последовательно, во втором нет. Конечно будет "медленней", но не в 15-20 раз как говорит Dmitry67. 146%. Проверь в своём компиляторе.
Dmitry67 wrote: 14 Feb 2018 10:57 Значит с фортраном перепутал)
В Фортране матрицы хранятся не так как массивы массивов в С\С++. Поэтому, подозреваю, что по второму варианту будет быстрее.
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: А в памяти моей такая скрыта мощь...

Post by Dmitry67 »

Блин, вы, вообще представляете во сколько раз L3/L2 быстрее основной памяти?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: А в памяти моей такая скрыта мощь...

Post by OtherSide »

Dmitry67 wrote: 14 Feb 2018 20:00 Кстати задумался

В C# тоже есть оператор запятая
Но есть и двумерные массивы
Налицо двусмысленность синтаксиса
никакой двусмысленности, там разный смысл совершенно
fleshold
Уже с Приветом
Posts: 145
Joined: 29 Apr 2014 12:22

Re: А в памяти моей такая скрыта мощь...

Post by fleshold »

Dmitry67 wrote: 14 Feb 2018 20:00 Кстати задумался

В C# тоже есть оператор запятая
Но есть и двумерные массивы
Налицо двусмысленность синтаксиса
Я не видел С# лет 10, да и поработать с ним слава богу много не пришлось. , запятая в шарпе это просто "сепаратор", а не оператор как в С\С++\ЖабаСкрпт. В шарпе насколько знаю есть три типа массива - одномерный, многомерный, и нерегулярный (массив массивов которые могут быть разной длины). Но большего сказать не могу. Да и сишарписты не любят массивы насколько наслышан от знакомых так и малознакомых использующий этот язык. Вот например мнение мембера of the C# language design team -
https://blogs.msdn.microsoft.com/ericli ... t-harmful/ Хотя может за 10 лет всё изменилось и с массивами всё ОК там и запятую добавили. Не в курсе.
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15477
Joined: 27 Sep 2007 22:53

Re: А в памяти моей такая скрыта мощь...

Post by Мальчик-Одуванчик »

Dmitry67 wrote: 15 Feb 2018 09:10 Блин, вы, вообще представляете во сколько раз L3/L2 быстрее основной памяти?
Хде? Я вот откомпилировал Ваш пример на арме и нифига.
User avatar
AndreyT
Уже с Приветом
Posts: 3009
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: А в памяти моей такая скрыта мощь...

Post by AndreyT »

OtherSide wrote: 14 Feb 2018 09:56 в смысле. В c/с++ только одномерные массивы
С такой точки зрения во всех языках программирования существуют только одномерные массивы, ибо память в компьютере одномерна.
Best regards,
Андрей

Return to “Вопросы и новости IT”