Как из этого выжать максимальную скорость?
От: Аноним  
Дата: 17.08.05 08:53
Оценка: 15 (1)
    for(unsigned int l=0; l<size*size; l++)
    {
        marks[l] = klas.yel[l]; <--- memcpy?
        data[l] = 99999;        <--- ?
    }
Re: Как из этого выжать максимальную скорость?
От: jazzer Россия Skype: enerjazzer
Дата: 17.08.05 09:00
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>    for(unsigned int l=0; l<size*size; l++)
А>    {
А>        marks[l] = klas.yel[l]; <--- memcpy?
А>        data[l] = 99999;        <--- ?
А>    }
А>


скомпилировать с оптимизацией по скорости.
и умножение size*size вынести за пределы цикла, хотя упомянутая оптимизация сама это вполне сможет сделать.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Как из этого выжать максимальную скорость?
От: Amethyst  
Дата: 17.08.05 09:00
Оценка:
Здравствуйте, Аноним, Вы писали:


А>    for(unsigned int l=0; l<size*size; l++)
А>    {
А>        marks[l] = klas.yel[l]; <--- memcpy?
А>        data[l] = 99999;        <--- ?
А>    }

memset() ?
Почему добро всегда побеждает зло? Потому что историю пишут победители.
Re: Как из этого выжать максимальную скорость?
От: arcman Россия  
Дата: 17.08.05 09:09
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>    for(unsigned int l=0; l<size*size; l++)
А>    {
А>        marks[l] = klas.yel[l]; <--- memcpy?
А>        data[l] = 99999;        <--- ?
А>    }
А>


для начала лучше разнести на два цикла, плюс адрессацию с индекса внутри массива заменить на работу с указателями
оптимизация записи в память подробно расписанна в книге Криса Касперски — "Техника оптимизации программ"
Re[2]: Как из этого выжать максимальную скорость?
От: Аноним  
Дата: 17.08.05 09:22
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:



А>>
А>>    for(unsigned int l=0; l<size*size; l++)
А>>    {
А>>        marks[l] = klas.yel[l]; <--- memcpy?
А>>        data[l] = 99999;        <--- ?
А>>    }
А>>


J>скомпилировать с оптимизацией по скорости.

J>и умножение size*size вынести за пределы цикла, хотя упомянутая оптимизация сама это вполне сможет сделать.

Все равно проигрывает memcpy в 3 раза. vc7.1 release.
Re[2]: Как из этого выжать максимальную скорость?
От: Аноним  
Дата: 17.08.05 09:27
Оценка:
Здравствуйте, arcman, Вы писали:

A>Здравствуйте, Аноним, Вы писали:



А>>
А>>    for(unsigned int l=0; l<size*size; l++)
А>>    {
А>>        marks[l] = klas.yel[l]; <--- memcpy?
А>>        data[l] = 99999;        <--- ?
А>>    }
А>>


A>для начала лучше разнести на два цикла, плюс адрессацию с индекса внутри массива заменить на работу с указателями

A>оптимизация записи в память подробно расписанна в книге Криса Касперски — "Техника оптимизации программ"

Книги нет А как с указателями?
Re[3]: Как из этого выжать максимальную скорость?
От: jazzer Россия Skype: enerjazzer
Дата: 17.08.05 09:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, arcman, Вы писали:


A>>Здравствуйте, Аноним, Вы писали:



А>>>
А>>>    for(unsigned int l=0; l<size*size; l++)
А>>>    {
А>>>        marks[l] = klas.yel[l]; <--- memcpy?
А>>>        data[l] = 99999;        <--- ?
А>>>    }
А>>>


A>>для начала лучше разнести на два цикла, плюс адрессацию с индекса внутри массива заменить на работу с указателями

A>>оптимизация записи в память подробно расписанна в книге Криса Касперски — "Техника оптимизации программ"

А>Книги нет :( А как с указателями?


вместо инкремента индекса l++ и обращения по нему data[l] инкрементишь указатели на элементы массива, начиная с data, а лучше — заканчивая, т.е.
for (int *p = data+size*size; p!=data; *(--p) = 99999);
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Как из этого выжать максимальную скорость?
От: Net Cognition  
Дата: 17.08.05 09:42
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>вместо инкремента индекса l++ и обращения по нему data[l] инкрементишь указатели на элементы массива, начиная с data, а лучше — заканчивая, т.е.

J>
J>for (int *p = data+size*size; p!=data; *(--p) = 99999);  
J>


Можно приминить еще, разворачивание цикла.
Re[4]: Как из этого выжать максимальную скорость?
От: Аноним  
Дата: 17.08.05 09:42
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, arcman, Вы писали:


A>>>Здравствуйте, Аноним, Вы писали:



А>>>>
А>>>>    for(unsigned int l=0; l<size*size; l++)
А>>>>    {
А>>>>        marks[l] = klas.yel[l]; <--- memcpy?
А>>>>        data[l] = 99999;        <--- ?
А>>>>    }
А>>>>


A>>>для начала лучше разнести на два цикла, плюс адрессацию с индекса внутри массива заменить на работу с указателями

A>>>оптимизация записи в память подробно расписанна в книге Криса Касперски — "Техника оптимизации программ"

А>>Книги нет А как с указателями?


J>вместо инкремента индекса l++ и обращения по нему data[l] инкрементишь указатели на элементы массива, начиная с data, а лучше — заканчивая, т.е.

J>
J>for (int *p = data+size*size; p!=data; *(--p) = 99999);
   
J>


Сделал. memcpy быстрее в 1.5 раза.
Re: Как из этого выжать максимальную скорость?
От: glyph  
Дата: 17.08.05 09:45
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>
А>    for(unsigned int l=0; l<size*size; l++)
А>    {
А>        marks[l] = klas.yel[l]; <--- memcpy?
А>        data[l] = 99999;        <--- ?
А>    }
А>

Для чего требуется повышение быстродействия?
На глаз — вынести заполнение массива data из цикла. Попробовать memset, правда, не знаю, будет ли быстрее. Ну а общий подход — смотреть, какие ассемблерные команды генерируются и, если что, переписывать как ассемблерную вставку.
Но зачем, однако?
... << RSDN@Home 1.1.4 beta 3 rev. 193>>
Re[2]: Как из этого выжать максимальную скорость?
От: ssm Россия  
Дата: 17.08.05 09:47
Оценка:
Здравствуйте, arcman, Вы писали:


A>для начала лучше разнести на два цикла,


помоему это должно только замедлить

A>плюс адрессацию с индекса внутри массива заменить на работу с указателями



я всегда считал, что нет разницы между
marks[l] = klas.yel[l];

и
marks + l = klas + l;
Re[2]: Как из этого выжать максимальную скорость?
От: Аноним  
Дата: 17.08.05 09:50
Оценка:
Здравствуйте, glyph, Вы писали:

G>Здравствуйте, <Аноним>, Вы писали:


А>>
А>>    for(unsigned int l=0; l<size*size; l++)
А>>    {
А>>        marks[l] = klas.yel[l]; <--- memcpy?
А>>        data[l] = 99999;        <--- ?
А>>    }
А>>

G> Для чего требуется повышение быстродействия?
G> На глаз — вынести заполнение массива data из цикла. Попробовать memset, правда, не знаю, будет ли быстрее. Ну а общий подход — смотреть, какие ассемблерные команды генерируются и, если что, переписывать как ассемблерную вставку.
G> Но зачем, однако?

Как memset? memset(data,99999,sizeof(unsigned int)*size*size); не пашет.
Re[3]: Как из этого выжать максимальную скорость?
От: Gleb Alexeev  
Дата: 17.08.05 09:54
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>

ssm>я всегда считал, что нет разницы между
ssm>
ssm>marks[l] = klas.yel[l];
ssm>

ssm>и
ssm>
ssm>marks + l = klas + l;
ssm>

Нет разницы.
Но в цикле есть (правда, не знаю, может оптимизаторы уже умеют сами обращение по индексу в цикле в адресную арифметику преобразовывать).

Псевдокод с индексированием:

for(int i=0; i<n; ++i) {
  char* addr = (char*)array + sizeof(T)*i;
}



Псевдокод с адресной арифметикой:

char *end = (char *)array+sizeof(array)*sizeof(T);
for(char *addr=(char *)array; addr!=end; addr+=sizeof(T)) {
  // используем addr
}


Т.е избавились от умножения в цикле.
Re[5]: Как из этого выжать максимальную скорость?
От: jazzer Россия Skype: enerjazzer
Дата: 17.08.05 10:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Сделал. memcpy быстрее в 1.5 раза.


Оптимизацию по скорости включил? Компилятор у тебя какой?

Все эти извращения с указателями нормальный компилятор должен разворачивать в sse-шные инструкции для Intel и в аналогичные, если есть, на других. Более того, он должен оптимизировать и обычный цикл с индексами.

см, например, здесь:
http://rsdn.ru/Forum/Message.aspx?mid=1329039&amp;only=1
Автор: Mr. None
Дата: 16.08.05
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Как из этого выжать максимальную скорость?
От: Gleb Alexeev  
Дата: 17.08.05 10:14
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>    for(unsigned int l=0; l<size*size; l++)
А>    {
А>        marks[l] = klas.yel[l]; <--- memcpy?
А>        data[l] = 99999;        <--- ?
А>    }
А>

Тут недавно Bell ссылку давал.
Прелюбопытнейшая статья, особенно Duff's device мне понравился.

Кстати, обратите внимание, что если вам надо поддерживать несколько компиляторов, то результаты сравнения memcpy и for-цикла могут сильно варьироваться.
Re[3]: Как из этого выжать максимальную скорость?
От: KHeLeKRoN Россия  
Дата: 17.08.05 10:16
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, arcman, Вы писали:



A>>для начала лучше разнести на два цикла,

ssm>
ssm>помоему это должно только замедлить

AFAIK если код в цикле влезает в L1-кэш, то это оочень убыстрит всю работу (более чем в два раза). И такое разнесение поможет влезть.
And solder won't keep me together (c)
Re: Как из этого выжать максимальную скорость?
От: Bell Россия  
Дата: 17.08.05 10:19
Оценка:
Здравствуйте, Аноним, Вы писали:


Вот в этом топике
Автор:
Дата: 15.08.05
я давал ссылку на статью товарища Александреску. Посмотри, быть может русский крестьянин тебе поможет
Любите книгу — источник знаний (с) М.Горький
Re[2]: Как из этого выжать максимальную скорость?
От: Аноним  
Дата: 17.08.05 10:23
Оценка:
Здравствуйте, Gleb Alexeev, Вы писали:

GA>Здравствуйте, Аноним, Вы писали:



А>>
А>>    for(unsigned int l=0; l<size*size; l++)
А>>    {
А>>        marks[l] = klas.yel[l]; <--- memcpy?
А>>        data[l] = 99999;        <--- ?
А>>    }
А>>

GA>Тут недавно Bell ссылку давал.
GA>Прелюбопытнейшая статья, особенно Duff's device мне понравился.

GA>Кстати, обратите внимание, что если вам надо поддерживать несколько компиляторов, то результаты сравнения memcpy и for-цикла могут сильно варьироваться.


В статье memcpy всех порулил. Буду его использовать. (Пишу только на vc7.1)
Re[6]: Как из этого выжать максимальную скорость?
От: Аноним  
Дата: 17.08.05 10:31
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:


А>>Сделал. memcpy быстрее в 1.5 раза.


J>Оптимизацию по скорости включил? Компилятор у тебя какой?


J>Все эти извращения с указателями нормальный компилятор должен разворачивать в sse-шные инструкции для Intel и в аналогичные, если есть, на других. Более того, он должен оптимизировать и обычный цикл с индексами.


J>см, например, здесь:

J>http://rsdn.ru/Forum/Message.aspx?mid=1329039&amp;only=1
Автор: Mr. None
Дата: 16.08.05


/o2 vc7.1 Остановился на самом быстром — memcpy.
Re[3]: Как из этого выжать максимальную скорость?
От: Gleb Alexeev  
Дата: 17.08.05 10:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В статье memcpy всех порулил. Буду его использовать. (Пишу только на vc7.1)

Ну а вот с этим:
data[l] = 99999; <--- ?
можно поэкпериментировать.

И вообще, когда будете работать с non-POD'ами, в статье найдете источник вдохновения.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.