Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
BagaBagaНо я всё равно не понимаю вашей задачи (да она и не озвучена). Все просто - создается массив структур: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Чтобы обнулить var_n для структур B, нужно в цикле их все перебрать и задать B.var_n=0. В то время для обнуления структур А достаточно с помощью memset обнулить массив, где хранятся значения. Если обнуление делается много миллионов раз, то второй способ быстрее. Аналогично, можно в любой момент сделать "снимок" системы, сохранив массив значений в отдельный буфер и восстановить систему, загрузив массив из буфера. Опять же это быстрее циклического перебора структур. BagaBagaсоздание простого массива (через new) и его последующая инициализация с memset по сравнению с vector<int>v(elem_number, 0) давало выигрыш менее 0.5%. А кто сказал, что внешним массивом не может быть вектор? Речь идет не об инициализации массива, а о массовых операциях изменения значений массива в сравнении с изменением значений каждой структуры в цикле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2013, 21:59 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyandreybsИзвестно, что обращение к переменной по указателю type* осуществляется в два шага: считывание адреса из указателя, переход по адресу. В то же время ссылка type& содержит прямой адрес на значение переменной в памяти, поэтому обращение по ссылке занимает на один шаг меньше. При выполнении высокопроизводительных операций эта разница ощутима Это не так. На уровне машинного кода реализация указателя и ссылки одинаковая, поэтому никакой разницы в скорости у них нет. (Где вы вообще про такое прочли?) Соответственно, необходимость изменения ссылок надумана. Используйте указатели. Ссылка int & соответствует int *const __restrict - в этом случае они всегда соптимизируются одинаково. Если указатель без const или __restrict, то у него меньше возможностей к оптимизации, чем у ссылки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2013, 22:53 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
int *const __restrict, А сможете привести пример, когда будет разный код сгенерирован? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2013, 23:10 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
int *const __restrict, Если обычному указателю приписать __restrict, то у него будет больше возможностей к оптимизации? т.е. в моем случае вместо T* _ptr; использовать T* __restrict _ptr; Есть еще хинты в оптимизации работы указателей, на которые следует обратить внимание? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2013, 23:19 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
andreybs, Вы не до конца поняли. Нужно и const и __restrict. То есть вы не сможете в указатель присваивать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2013, 23:22 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
Топикстартеру на заметку: Вообще, обнуление структур через memset - штука небезопасная, надо знать, какие структуры. POD структуры — все будет ок. Не POD — будет беда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2013, 23:39 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
andreybs, похоже, я не могу понять вас (используемую вами терминологию). Если у нас есть массив my_class arr[100] то у меня в каждом элементе массива хранится одна структура. Это значит, что я её могу обойти, например, так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Я это к тому, что в любом случае ваше var<double> var_n хранится в структуре. Это, конечно, может быть указатель (или ссылка) на что-то "снаружи". И вот тут я начинаю непонимать: речь идёт об "очистке" одной структуры? Тогда вы работаете с одной единицей и "валовые операции" вам не нужны. Вы меняете что-то для "кучи" структур? Но как тогда построить соответствие между местом в массиве (или векторе или что вы там используете) и местом в этом "снаружи"? То, что вы озвучиваете, мне напоминает ситуацию: у меня есть два поля, одно из которых меняется редко, а другое - часто. Заведу под них массивы: double rare[maxsize] double freq[maxsize] Но мне же почему-то неудобно показать, что это два массива. Поэтому я сделаю псевдообвязку, в которой одно поле будет указывать (а уж как - через указатели или ссылки - не важно) на rare[i], а во второй - на freq[i]. И заведу массив такого же размера для обвязок (не создавать же ручками кучу переменных). Вот только тогда и можно "показать фокус" и почистить скопом freq, не пробегаясь по массиву обвязок. Но это автоматически означает, что у вас в массиве freq могут храниться только "плоские" POD-типы. Про структуры и классы придётся забыть - по причине особенностей хранения данных (например, вследствие выравнивания структур) как минимум. А так, без примера очищения "скопом", я не могу понять, о чём вообще речь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2013, 23:59 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
MasterZivТопикстартеру на заметку: Вообще, обнуление структур через memset - штука небезопасная, надо знать, какие структуры. POD структуры — все будет ок. Не POD — будет беда. Обнуляются не структуры, а только некоторые их члены, значение которых вынесено в отдельный массив данных по указателю. В итоге обнуляется массив данных, а не массив структур. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2013, 08:17 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
BagaBagaТо, что вы озвучиваете, мне напоминает ситуацию: у меня есть два поля, одно из которых меняется редко, а другое - часто. Заведу под них массивы: double rare[maxsize] double freq[maxsize] Но мне же почему-то неудобно показать, что это два массива. Поэтому я сделаю псевдообвязку, в которой одно поле будет указывать (а уж как - через указатели или ссылки - не важно) на rare[i], а во второй - на freq[i]. И заведу массив такого же размера для обвязок (не создавать же ручками кучу переменных). Вот только тогда и можно "показать фокус" и почистить скопом freq, не пробегаясь по массиву обвязок. Вы все верно поняли. Такой "изворот" нужен из-за того, что сами вычисления делаются поэлементо со структурами и их членами (от этого не уйти), а инициализация данных для вычислений осуществляется массово за один раз через внешние массивы с данными (для ускорения каждого цикла вычислений). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2013, 08:26 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyandreybs, Вы не до конца поняли. Нужно и const и __restrict. То есть вы не сможете в указатель присваивать :) Если я правильно понял, что написано здесь и здесь , то __restrict имеет определенный смысл - мы как бы привязываем указатель к определенной области памяти и обещаем его не перезаписывать указателями из других областей. Как раз мой случай, а отсутствие const как раз разрешает менять указатель. Полагаю, нельзя будет ему присваивать NULL - не проблема, можно инициализировать статической переменной типа static T __restrict init_var; (если такая запись проканает). Вобщем, надо будет попробовать и посмотреть на изменение скорости работы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2013, 08:41 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
andreybs, Да не будет никакого изменения в скорости. Вы не там оптимизируете. Оптимизировать надо алгоритм, а не машинный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2013, 14:38 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyint *const __restrict, А сможете привести пример, когда будет разный код сгенерирован? :) Сходу не приведу, но недавно встречался как раз такой случай, когда заданные в коде константы в compile-time проваливались глубоко внутрь кода через *const __restrict, и сильно оптимизировали код, в том время, как без этих квалификаторов такого не происходило. andreybs , Вообще это C-style подход. А в C++ нет ничего проще, чем использовать ссылку &, если мы конечно работаем не в google, где разрешены только константные ссылки в параметрах функций :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2013, 15:22 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
andreybsОбнуляются не структуры, а только некоторые их члены, значение которых вынесено в отдельный массив данных по указателю. В итоге обнуляется массив данных, а не массив структур. Вот тут у меня с вами принципиальное расходение в терминологии: ничего в структурах не обнуляется. Там как хранились "редкие данные", так и хранятся. Как хранился адрес (в виде указателя или ссылки - не важно) на "частые" данные, так и хранится. А что происходит с тем куском памяти, ссылка на который хранится в структуре, структуре глубоко всё равно - хоть обнуляйте, хоть генератором случайных чисел заполняйте. И да, похоже, сначала нужно хорошо оптимизировать алгоритм, а уже потом пытаться выиграть на "массовом заполнении" вместо "индивидуального". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2013, 19:12 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
*const __restrict andreybs , Вообще это C-style подход. А в C++ нет ничего проще, чем использовать ссылку &, если мы конечно работаем не в google, где разрешены только константные ссылки в параметрах функций :) Мне нужно инициализировать ссылку не в момент создания экземпляра содержащий ее структуры, а после создания всех экземпляров структур. Кстати, я стараюсь везде использовать константные ссылки в качестве параметров функций... :) Не знаю, как там оптимизатор решит, но так точно не будет создаваться копии параметра в области видимости функции... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2013, 20:51 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
BagaBagaВот тут у меня с вами принципиальное расходение в терминологии: ничего в структурах не обнуляется. Там как хранились "редкие данные", так и хранятся. Как хранился адрес (в виде указателя или ссылки - не важно) на "частые" данные, так и хранится. А что происходит с тем куском памяти, ссылка на который хранится в структуре, структуре глубоко всё равно - хоть обнуляйте, хоть генератором случайных чисел заполняйте. Разумеется, в структурах физически ничего не обнуляется, ведь они содержат указатели. :) BagaBagaИ да, похоже, сначала нужно хорошо оптимизировать алгоритм, а уже потом пытаться выиграть на "массовом заполнении" вместо "индивидуального". Какая основная идея оптимизации многократно повторяющейся последовательности? - Упростить тело цикла. Вот как раз замена вложенных циклов на "массовые операции" и позволяют ускорить тело цикла, пусть даже в ущерб быстродействию подготовки данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.09.2013, 21:01 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
Если нельзя, но очень хочется, то ... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. andreybsКакая основная идея оптимизации многократно повторяющейся последовательности? - Упростить тело цикла. Вот как раз замена вложенных циклов на "массовые операции" и позволяют ускорить тело цикла, пусть даже в ущерб быстродействию подготовки данных. Очень просто - путём уменьшения количества операций. Т.е. выноса обнулений за циклы и т.п. Используемый вами механизм тоже не даётся даром. Вы используете по одной ссылке на каждый элемент массива (в своей структуре-обёртке). Она не даётся даром. На указатель нужна память, в размере (в большинстве реализаций) 32bit (64-разрядные системы для простоты не рассматриваю). Это значит, что для "частых" данных вы практически удваиваете необходимое количество памяти - на сами данные и на указатель на эти данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 20:27 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
BagaBagaЕсли нельзя, но очень хочется, то ... Я думал об этом. Отказался от этого подхода из-за того, что в структурах есть еще и массивы указателей на другие связанные структуры. Частое копирование массивов - дело невыгодное для производительности, а передача ссылки на массив по цепочке выглядит не слишком красиво и не прозрачно. Непонятно, кто должен уничтожать массив при уничтожении структуры, значит потребуется добавить деструктор и т.д. структура плавно превращается в класс... BagaBagaИспользуемый вами механизм тоже не даётся даром. Вы используете по одной ссылке на каждый элемент массива (в своей структуре-обёртке). Она не даётся даром. На указатель нужна память, в размере (в большинстве реализаций) 32bit (64-разрядные системы для простоты не рассматриваю). Это значит, что для "частых" данных вы практически удваиваете необходимое количество памяти - на сами данные и на указатель на эти данные. Согласен, ничего не дается даром, я жертвую избыточным объемом данных. Но в моем случае это приемлемые потери, ибо одновременно удерживаемых в памяти структур с такими указателями не так много (не более 2-3 тыс), а вот обращение к ним весьма интенсивное. Да и "частых" данных всего 3 поля double, но они ооочень "частые"... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 21:28 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
andreybs, А что за прикладная область? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 21:32 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
andreybs, вообще-то этот код Код: plaintext 1. делает ровно то, что спрашивается в заголовке топика: он изменяет адрес ссылки (в данном случае две ссылки, хранящиеся внутри структуры). Или вам было нужно что-то другое? Но тогда что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 21:54 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
Если нужно пересвязать с другими переменными, то можно и так (используя другой конструктор) Код: plaintext 1. в s3 будут храниться ссылки на v1 и v2, вне зависимости от того, но что они ссылались раньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 22:00 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyandreybs, А что за прикладная область? Нейронные сети. Иду на рекорд... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 23:34 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
BagaBagaandreybs, вообще-то этот код Код: plaintext 1. делает ровно то, что спрашивается в заголовке топика: он изменяет адрес ссылки (в данном случае две ссылки, хранящиеся внутри структуры). Или вам было нужно что-то другое? Но тогда что? Вы все верно ответили по теме, спасибо за совет. Просто момент создания темы я ошибочно полагал, что ссылки по определению быстрее указателей... Спасибо форумчанам, помогли разобраться и это помогло мне найти неплохое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 23:37 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
andreybsAnatoly Moskovskyandreybs, А что за прикладная область? Нейронные сети. Иду на рекорд... :) А, тупиковая ветвь ИИ. Самое неблагодарное занятие - оптимизировать по крохам алгоритм, чью работоспособность еще предстоит доказать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2013, 00:07 |
|
||
|
изменить адрес ссылки
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА, тупиковая ветвь ИИ. Самое неблагодарное занятие - оптимизировать по крохам алгоритм, чью работоспособность еще предстоит доказать :) Довольно субъективное и весьма спорное утверждение. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2013, 08:40 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38390624&tid=2019985]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 285ms |
| total: | 455ms |

| 0 / 0 |
