Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Кинь тогда хоть какие-то примерные входные данные и что должно получится. На мой взгляд, код вполне можно упростить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:34 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Сорри, сразу не заметил Контрольный пример: f(4294967337, 8589934591) = 1. Это числа длиной 33 бита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, напрашивается декремент b вместо инкремента c ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovAR®, напрашивается декремент b вместо инкремента c Пробовал. А точнее, был декремент c при начальном c = b: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Результат был хуже на ~5%. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:45 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНа мой взгляд, код вполне можно упростить. Буду благодарен. Но у меня теперь большие сомнения в этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:48 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
маска e = -(d & 1) может иметь всего два значения (-1 или 0) в зависимости от младшего бита d соответственно e & a может иметь 2 значения (a или 0) в зависимости от младшего бита d поэтому для вычисления этого выражения проще всего использовать условную пересылку после проверки бита d ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:49 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr SharahovAR®, напрашивается декремент b вместо инкремента c Пробовал. А точнее, был декремент c при начальном c = b: Результат был хуже на ~5%. нафига тут вообще нужна доп. переменная с? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:51 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovмаска e = -(d & 1) может иметь всего два значения (-1 или 0) в зависимости от младшего бита d соответственно e & a может иметь 2 значения (a или 0) в зависимости от младшего бита d поэтому для вычисления этого выражения проще всего использовать условную пересылку после проверки бита d I think so + вместо __int64 для цикла, можно использовать два вложенных цикла по __int32. Максимум избавиться от арифметики над __int64 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:05 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Я так понимаю это обращение к памяти, если использовать регистр проца, то быстрее должно стать AR® Код: plaintext 1. 2. 3. У меня вот во что откомпилировалось MSVC 2015 Release x64 Код: 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. Время 9.3 сек. на i7-6700K Если не секрет - в чем суть этого цикла? что он делает? Может алгоритм можно сменить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:11 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovнафига тут вообще нужна доп. переменная с? Для её инкремента от 0 до b, т.к. вариант с декрементом оказался медленнее, хотя и не очень сильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:29 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Leonid KudryavtsevНа мой взгляд, код вполне можно упростить. Буду благодарен. Но у меня теперь большие сомнения в этом. Дай еще каких нибудь циферек для проверки. А то я в циклах запустался ))) твой код 23-24 с., мой вариант 18 сек ассемблер не смотрел. На C давно не программировал (лет 12), т.ч. извеняюсь за говно-код и плохое оформление))) Код: 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. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:30 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovмаска e = -(d & 1) может иметь всего два значения (-1 или 0) в зависимости от младшего бита d соответственно e & a может иметь 2 значения (a или 0) в зависимости от младшего бита d поэтому для вычисления этого выражения проще всего использовать условную пересылку после проверки бита d Затестил. Втрое медленнее как ни странно Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:31 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev+ вместо __int64 для цикла, можно использовать два вложенных цикла по __int32. Максимум избавиться от арифметики над __int64 Мы избавлены от неё 32-битным компилятором. Напомню, что всё делается на 32-битном компе. И два 32-битных счётчика нам организовал сам компилятор. В случае инкремента так: Код: plaintext 1. 2. А в случае декремента так: Код: plaintext 1. 2. Последнее оказалось немного медленнее (почему?). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Тут между командами взаимозависимость по регистру флагов. Т.е. теоретически "плохо". Но теоретически, практически там возможны исчезающие доли процентов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:39 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevДай еще каких нибудь циферек для проверки. А то я в циклах запустался ))) f(6777995264, 8589934591) = 1 f(5033164800, 8589934591) = 1 Второе число не трогайте (это маска 33 бита == 1), а первое можете уменьшить-увеличить на 1, функция должна вернуть 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:44 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TЗатестил. Втрое медленнее как ни странно Код: plaintext 1. 2. 3. 4. 5. 6. 7. Это не странно. Первоначальный алгоритм содержал if / else, а затем от них избавились путём подбора масок (000..00 и 111..11), позволяющих всегда делать одинаковые действия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:49 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TAleksandr Sharahovмаска e = -(d & 1) может иметь всего два значения (-1 или 0) в зависимости от младшего бита d соответственно e & a может иметь 2 значения (a или 0) в зависимости от младшего бита d поэтому для вычисления этого выражения проще всего использовать условную пересылку после проверки бита d Затестил. Втрое медленнее как ни странно Код: plaintext 1. 2. 3. 4. 5. 6. 7. Ну так компилер не такой же умный, чтоб понять, что о от него требуется надо что-то вроде этого e=0; if (d and 1) e=a; d^=e; или сразу всю функцию на асме с условной пересылкой написать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:49 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TУ меня вот во что откомпилировалось Так это всё под x64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:50 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
В продолжение 21476642 добавлю x32 вариант, тут тоже нет обращений к памяти внутри цикла Так компилируется в x32 Код: 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. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 13.7 сек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:51 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovНу так компилер не такой же умный, чтоб понять, что от него требуется Мне теперь кажется, что он даже умнее, чем просто чтоб понять, что от него требуется. :) Aleksandr Sharahovсразу всю функцию на асме с условной пересылкой написать Писал (как вставку в C) 3 версии, все работают дольше, чем "компиляторская". :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:54 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr SharahovНу так компилер не такой же умный, чтоб понять, что от него требуется Мне теперь кажется, что он даже умнее, чем просто чтоб понять, что от него требуется. :) Aleksandr Sharahovсразу всю функцию на асме с условной пересылкой написать Писал (как вставку в C) 3 версии, все работают дольше, чем "компиляторская". :) с использованием CMOV получилось медленнее? не верю ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:59 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovНу так компилер не такой же умный, чтоб понять, что о от него требуется надо что-то вроде этого e=0; if (d and 1) e=a; d^=e; или сразу всю функцию на асме с условной пересылкой написать тоже тормоз Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:01 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TВ продолжение 21476642 добавлю x32 вариант, тут тоже нет обращений к памяти внутри цикла Так компилируется в x32 Очень интересно. Особенно, в чём глубокий смысл "and edx, 29h "? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TAleksandr SharahovНу так компилер не такой же умный, чтоб понять, что о от него требуется надо что-то вроде этого e=0; if (d and 1) e=a; d^=e; или сразу всю функцию на асме с условной пересылкой написать тоже тормоз Код: plaintext 1. 2. 3. 4. Интересно, а if(d & 1) e = a; компилируется с переходом или с CMOV'ом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:05 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima Tтоже тормоз Код: plaintext 1. 2. 3. 4. Не мучайтесь. :) Разные варианты этого алгоритма с ветвлениями были испытаны, и все были в 2-3 раза медленнее. Причём это верно и для чисел до 32 бит (когда всё без __int64). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:09 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39657577&tid=1340094]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
172ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 274ms |
| total: | 563ms |

| 0 / 0 |
