для начала лучше разнести на два цикла, плюс адрессацию с индекса внутри массива заменить на работу с указателями
оптимизация записи в память подробно расписанна в книге Криса Касперски — "Техника оптимизации программ"
Re[2]: Как из этого выжать максимальную скорость?
От:
Аноним
Дата:
17.08.05 09:22
Оценка:
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Аноним, Вы писали:
J>скомпилировать с оптимизацией по скорости. J>и умножение size*size вынести за пределы цикла, хотя упомянутая оптимизация сама это вполне сможет сделать.
Все равно проигрывает memcpy в 3 раза. vc7.1 release.
Re[2]: Как из этого выжать максимальную скорость?
От:
Аноним
Дата:
17.08.05 09:27
Оценка:
Здравствуйте, arcman, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
A>для начала лучше разнести на два цикла, плюс адрессацию с индекса внутри массива заменить на работу с указателями A>оптимизация записи в память подробно расписанна в книге Криса Касперски — "Техника оптимизации программ"
A>>для начала лучше разнести на два цикла, плюс адрессацию с индекса внутри массива заменить на работу с указателями A>>оптимизация записи в память подробно расписанна в книге Криса Касперски — "Техника оптимизации программ"
А>Книги нет :( А как с указателями?
вместо инкремента индекса l++ и обращения по нему data[l] инкрементишь указатели на элементы массива, начиная с data, а лучше — заканчивая, т.е.
for (int *p = data+size*size; p!=data; *(--p) = 99999);
Здравствуйте, jazzer, Вы писали:
J>вместо инкремента индекса l++ и обращения по нему data[l] инкрементишь указатели на элементы массива, начиная с data, а лучше — заканчивая, т.е. J>
A>>>для начала лучше разнести на два цикла, плюс адрессацию с индекса внутри массива заменить на работу с указателями A>>>оптимизация записи в память подробно расписанна в книге Криса Касперски — "Техника оптимизации программ"
А>>Книги нет А как с указателями?
J>вместо инкремента индекса l++ и обращения по нему data[l] инкрементишь указатели на элементы массива, начиная с data, а лучше — заканчивая, т.е. J>
Для чего требуется повышение быстродействия?
На глаз — вынести заполнение массива data из цикла. Попробовать memset, правда, не знаю, будет ли быстрее. Ну а общий подход — смотреть, какие ассемблерные команды генерируются и, если что, переписывать как ассемблерную вставку.
Но зачем, однако?
G> Для чего требуется повышение быстродействия? G> На глаз — вынести заполнение массива data из цикла. Попробовать memset, правда, не знаю, будет ли быстрее. Ну а общий подход — смотреть, какие ассемблерные команды генерируются и, если что, переписывать как ассемблерную вставку. G> Но зачем, однако?
Как memset? memset(data,99999,sizeof(unsigned int)*size*size); не пашет.
Здравствуйте, Аноним, Вы писали:
А>Сделал. memcpy быстрее в 1.5 раза.
Оптимизацию по скорости включил? Компилятор у тебя какой?
Все эти извращения с указателями нормальный компилятор должен разворачивать в sse-шные инструкции для Intel и в аналогичные, если есть, на других. Более того, он должен оптимизировать и обычный цикл с индексами.
Тут недавно Bell ссылку давал.
Прелюбопытнейшая статья, особенно Duff's device мне понравился.
Кстати, обратите внимание, что если вам надо поддерживать несколько компиляторов, то результаты сравнения memcpy и for-цикла могут сильно варьироваться.
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&only=1
Здравствуйте, Аноним, Вы писали:
А>В статье memcpy всех порулил. Буду его использовать. (Пишу только на vc7.1)
Ну а вот с этим:
data[l] = 99999; <--- ?
можно поэкпериментировать.
И вообще, когда будете работать с non-POD'ами, в статье найдете источник вдохновения.