|
|
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Привет Все знают, какой я фанат оптимизаций, и вместе с тем нелюбитель писать тесты замера скорости Так вот несколько месяцев назад я с ужасом обнаружил, что используемые ранее (REP) MOVS команды - тормозные. Что обычный цикл записи работает быстрее. Кроме того реализация Move() в Delphi x64 оставляет желать лучшего мягко говоря (впрочем как и многое в RTL x64). Если я ничего не путаю, то скомпилированные x86 приложения в новых версиях Delphi не работают на машинах без поддержки SSE2. Это даёт мне все основания реализовать Move() через SSE(1). Весомое значение в стандартных Move() реализациях занимает ситуация с пересекающимися областями. Мне эта особенность нужна редко (впрочем как и многим). И поскольку я планирую реформу CachedBuffers, достаточно много внимания было уделено и Move(), потому что библиотека целиком и полностью посвящена копировании памяти. В итоге реализация выполнена, листинг приведу ниже, функция полностью проверена и отлажена для платформ x86 и x64. Поэтому: 1) Берите кому нужно 2) Если есть желание делать сравнительный тест скорости и вносить изменения - я за. Но гарантирую, что сам писать такой тест не буду. Нужно определиться с условиями, искать конкурентные реализации, закладываться на разное выравнивание. У меня на это времени и желания нет. Со своей стороны могу гарантировать лучшую производительность на x64 и для больших объёмов на x86. Но насколько именно - я увы не знаю. Have fun Код: pascal 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. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 17:58:35 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 18:05:35 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUнесколько месяцев назад я с ужасом обнаружил, что используемые ранее (REP) MOVS команды - тормозные Ещё через пару лет ты откроешь для себя технику Zero-Copy, так что забей. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 18:08:14 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Ну ты хоть какие-то тесты проведи, а то так совсем неинтересно. Ну, типа, на пересылке 100Кб данных работает в 3 раза быстрее чем стандартная move ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 18:20:23 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
можно старые бенчи от FastCode поднять а потом все равно придет шарахов и всех разгонит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 18:23:13 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Кстати, раз ты такой фанат оптимизации... У меня, по опыту, на общую производительность влияет больше не move а функция поиска символа в строке. Ниже приведу текущую реализацию. Слабо улучшить? Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 18:24:38 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЕщё через пару лет ты откроешь для себя технику Zero-Copy, так что забей. Как ты предлагаешь Zero-Copy вставить в Move? :) asviridenkovНу ты хоть какие-то тесты проведи, а то так совсем неинтересно. Ну, типа, на пересылке 100Кб данных работает в 3 раза быстрее чем стандартная move Да хз. Мне кажется не будет в 3 раза. Всё-таки многое упирается в кеш. Ну максимум процентов на 20-50 Хотя чем чёрт не шутит, надо смотреть. Я лишь знаю, что SSE, да в моём исполнении, должен дать прирост vavanможно старые бенчи от FastCode поднять а потом все равно придет шарахов и всех разгонит Можно Я за Сделай если не лень asviridenkovКстати, раз ты такой фанат оптимизации... У меня, по опыту, на общую производительность влияет больше не move а функция поиска символа в строке. Ниже приведу текущую реализацию. Слабо улучшить? Фу, ацтой! Есть же подходы, позволяющие найти символ в одной из частей регистра. Но в твоём случае надо будет придумать с выравниванием и SSE Посмотри здесь: http://www.wasm.ru/forum/viewtopic.php?id=16358&p=1 А в тырнете поищи константы 7EFEFEFF и 81010100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 18:53:46 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Я бы не заморачивался особо. По следующей причине : А недавно вдруг раз, и все вернулось на круги своя. (Может быть, для того, чтобы не заставлять переписывать memcpy на AVX?) Для последних процессоров классическая реализация memcpy снова самая быстрая. Так что если кто-то проспал 34 года, самое время вытащить старый код, и победно посмотреть на коллег, которые переписывали memcpy последовательно на MMX, SSE2, SSE3, SSE4.1. Думаю, вскоре и AMD подтянется, а через пару-тройку лет все велосипеды будут не нужны вообще :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 18:56:24 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Artem_NavЯ бы не заморачивался особо. По следующей причине: Думаю, вскоре и AMD подтянется, а через пару-тройку лет все велосипеды будут не нужны вообще :) Поживём-увидим Я лишь исхожу из того, что актуально сегодня All , Слушайте! Я сейчас почитал, для архитектуры x64 нельзя свободно использовать xmm6 и xmm7 - их надо сохранять на стеке Сейчас исправлю А есть такие же ограничения для x86? По моему нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 19:17:42 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUКак ты предлагаешь Zero-Copy вставить в Move? :) Посредством Ctrl-Y. Если твой алгоритм требует использования Move(), значит это неправильный алгоритм. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 19:29:25 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
В общем функция отныне выглядит так (добавлено сохранение/восстановление xmm6 и xmm7 в случае необходимости): Код: pascal 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. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 19:33:03 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovПосредством Ctrl-Y. Если твой алгоритм требует использования Move(), значит это неправильный алгоритм. Дим, мне кажется ты сегодня слишком устал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 19:35:10 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Раз ты с SSE разбирался, скажи pls, есть возможность умножить 4-ре 32 битных числа в одном xmm регистре на одно 32-битное число, с возвратом младших 32 бит результата. Ну или хотя-бы одной командой загрузить 32-битное число в xmm регистр с дублированием, как 4 32-битных числа. Потому как умножение одного xmm на другой я нашел, но без первых команд в нем смысла мало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 02:54:23 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Все знают, какой я фанат оптимизаций, и вместе с тем нелюбитель писать тесты замера скорости Код: pascal 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. https://yadi.sk/d/k1AkSVvLc5csC ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 03:04:34 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
TVoid, Получается выигрыш от силы 10% То есть в целом приложении вообще его не будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 05:09:32 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUСделай если не леньлень конечно, для моих задач меня вполне устраивают фасткодерские плюс на просторах в ассортименте прочих от интела, vs и т.п. если уж реально упираешься в move ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 09:07:35 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
vavanдля моих задач меня вполне устраивают фасткодерскиено твои инициативы всегда приветствую! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 09:10:08 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
Пока я бухал спал, тут такая тема вчера была )) Скачал тесты, преимущество максимум в несколько процентов. Решил, что фтопку такие портянки, оно того не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 09:12:47 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
asviridenkovРаз ты с SSE разбирался, скажи pls, есть возможность умножить 4-ре 32 битных числа в одном xmm регистре на одно 32-битное число, с возвратом младших 32 бит результата. Ну или хотя-бы одной командой загрузить 32-битное число в xmm регистр с дублированием, как 4 32-битных числа. Потому как умножение одного xmm на другой я нашел, но без первых команд в нем смысла мало. Да я не особо в SSE разбирался Но для твоего случае используют SHUFPS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 10:00:27 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
TVoid Оу, спасибо за первый тест! 1) Я не понял, ты 5Гб ОЗУ копируешь? 2) У тебя a и b варианты не отличаются. Что за Nc? 3) Тесты у тебя упираются в кеш, и скорее всего в файл подкачки 4) Тестировать мне кажется нужно на трёх компиляторах: новый Delphi x86, новый Delphi x64, старый Delphi (где не FastCode реализация). Для каждого из этих случаев скорость копирования будет отличаться 5) Я посмотрел исходники Move, там идёт разделение градаций размера на 1..8, 9..32 и 32+. У меня немного другие. Думаю тестировать копирование больше, чем 100кб - смысла нет. Ну и потом нафига тестировать кеш-мисс, если на практике данные преимущественно в кеше, ну как минимум 3 уровня. Поэтому для размера предлагаю такую вот штуку: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 6) Ну а для замера времени предлагаю устроить цикл. Причём обусловиться, что за замеряемое время копируется константный объём памяти, например порядка 1Гб Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 7) Ещё бы неплохо поиграться с выравниванием, как для Source, так и для Dest. Для стандартной реализации важно выравнивание на 8 байт, для моей - 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 10:40:12 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
defecatorСкачал тесты, преимущество максимум в несколько процентов. Решил, что фтопку такие портянки, оно того не стоит. Твои выводы обусловлены неумением анализировать ситуацию :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 10:41:10 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUdefecatorСкачал тесты, преимущество максимум в несколько процентов. Решил, что фтопку такие портянки, оно того не стоит. Твои выводы обусловлены неумением анализировать ситуацию :) Да мне пофигу, я стараюсь память не копировать с места на место, а обходиться указателями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 11:19:32 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
defecatorДа мне пофигу, я стараюсь память не копировать с места на место, а обходиться указателями. Да ты как бы не новатор :) Но порой не получается обойтись без Move. Это и операции со строками, и динамическими массивами, и в моём случае запись/чтение данных в "стрим" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 11:25:12 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUdefecatorДа мне пофигу, я стараюсь память не копировать с места на место, а обходиться указателями. Да ты как бы не новатор :) Но порой не получается обойтись без Move. Это и операции со строками, и динамическими массивами, и в моём случае запись/чтение данных в "стрим" Я разрабатываю, по большей части, проекты, которые должны работать 24x7x365, и использование там типов String, динамических массивов и всяких SetLength категорически выкидывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 11:28:23 |
|
||
|
Ну очень быстрый Move() для x86/x64
|
|||
|---|---|---|---|
|
#18+
defecatorЯ разрабатываю, по большей части, проекты, которые должны работать 24x7x365, и использование там типов String, динамических массивов и всяких SetLength категорически выкидывается. Я буду тебе благодарен, если ты избавишь нас от подробностей своей личной жизни Спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 11:31:46 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=38779287&tid=2041659]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
187ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 489ms |

| 0 / 0 |
