Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#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. Не нравится вот этот цикл из за возможности непроизводительной блокировки на потоках, которые еще выполняются. Код: plaintext 1. 2. 3. 4. По сути, напрашивается барьер, на который вешать ожидание завершения всех future. Попробовал было написать, но на моей реализации mingw4.8 wair_for постоянно возвращает timeout и в результате циклится: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. В связи с этим вопрос, как это грамотно делается в современном С++? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 15:21 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
Синхронизирован-ли f[i].get() ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 15:31 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
mayton, да, если нет результата, он его ждет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 15:36 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
причину зависания нашел, надо запускать async с в флагом async Код: plaintext 1. пересмотрел код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ерунду написал. переписал Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. теперь этот код работает как и ожидалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 16:09 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковНе нравится вот этот цикл из за возможности непроизводительной блокировки на потоках, которые еще выполняются. Код: plaintext 1. 2. 3. 4. По сути, напрашивается барьер, на который вешать ожидание завершения всех future. Откуда тут непроизвольная блокировка на потоках? Анатолий ШироковПопробовал было написать, но на моей реализации mingw4.8 wair_for постоянно возвращает timeout и в результате циклится: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. В связи с этим вопрос, как это грамотно делается в современном С++?std::chrono::milliseconds(0) - как бы и говорит выдать timeout сразу. И если уж хочется сразу загрузить все ядра в вашем примере, то передавайте явно std::launch::async Код: plaintext 1. Потому что по умолчанию идет launch::async | launch::deferred - а это значит, что поток запустится не в момент вызова std::async, а в момент вызова f[i].get(); - т.е. будет загружать ядра по одному. Ещё как бы вот так делают, как раз в документации на std::async та же самая сумма ряда, попробуйте сравнить скорости: http://en.cppreference.com/w/cpp/thread/async Вообще вот так на GPU это делается: http://back40computing.googlecode.com/svn-history/r1023/branches/cub/cub/docs/html/classcub_1_1_warp_scan.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 16:16 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
Вася Уткин, Да, я уже понял свою ошибку на счет запуска async. Но теперь когда понял, то все остальное честно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 16:26 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков, а какое макс. число потоков было замечено? И есть ли вообще ограничения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 16:45 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковВася Уткин, Да, я уже понял свою ошибку на счет запуска async. Но теперь когда понял, то все остальное честно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Если вы используете std::launch::async, то в этом коде нету смысла. Берите первый вариант: (только замените там 10, на N) Код: plaintext 1. 2. 3. С std::launch::async - все потоки запущены сразу, и вам в любом случае надо дождаться завершения последнего из них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 16:53 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
Вася Уткин, да, спасибо большое! овчинка выделки не стоит, прогнал тесты на 4-х ядерной машине Код: 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. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 17:12 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
mayton, поток в любом случае создается на каждый async, ограничения я думаю уже OS related. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 17:18 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковВася Уткин, да, спасибо большое! овчинка выделки не стоит, прогнал тесты на 4-х ядерной машине Да, т.к. особо не имеет смысла ставить N намного больше числа CPU-Cores, то в ближайшие лет 10 это N не будет значительным, чтобы не дожидаясь всех потоков, пытаться сложить уже полученные результаты. А через 10 лет, будет выгодней использовать подход на подобии этого с O(logN): Код: 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. Собственно в будущее позволяет заглянуть GPU, где уже выбран оптимальный путь для десятков тысяч виртуальных ядер: (в моем первом сообщении я картинкой ошибся, там для scan, а вот эта как раз для reduce) http://back40computing.googlecode.com/svn-history/r1023/branches/cub/cub/docs/html/classcub_1_1_cta_reduce.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 17:28 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#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. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 17:45 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
Если считать не SUM а AVG то можно заранее выдавать пользователю прибл. значение. еще до того как все потоки посчитаны. Удобно с точки зрения GUI или графиков и диаграм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 18:17 |
|
||
|
с++11: future, async, barrier
|
|||
|---|---|---|---|
|
#18+
maytonЕсли считать не SUM а AVG то можно заранее выдавать пользователю прибл. значение. еще до того как все потоки посчитаны. Удобно с точки зрения GUI или графиков и диаграм. да, если нормальное распределение, то приблизительная оценка будет недалека от истины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2014, 18:32 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38572019&tid=2019660]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 291ms |
| total: | 450ms |

| 0 / 0 |
