Просмотр сообщений
|
Страниц: 1 2 [3] 4 5 ... 15
|
37
|
Qt / Многопоточное программирование, процессы / Re: Не масштабится :-(
|
: Март 11, 2021, 10:13
|
Профайлер показывает что да, все нитки задействованы, но в основном стоят на барьере. Смысл разбиения - убрать барьер, т.е общие данные, каждый поток крутит исключительно свои данные. Интересно, можно больше подробностей? Крутил несколько млн итераций на ОМП на 8 ядрах, первые несколько секунд все 8 работают, потом по одному отключаются (на каждом ядре по очереди заканчивается данные) и последнее ядро свой кусок очень долго крутит. Может я что то не правильно делал, но это поведение мне не понравилось.
|
|
|
38
|
Qt / Многопоточное программирование, процессы / Re: Не масштабится :-(
|
: Март 10, 2021, 17:34
|
Пожалуйста, прочтите стартовый пост. Из первого поста не сильно понятно как было сделано распараллеливание. Хотя бы псевдокод посмотреть, с теми локами и конкурентным доступом к общим объектам. PS: OMP параллелит далеко не всегда адекватно.
|
|
|
39
|
Qt / Многопоточное программирование, процессы / Re: Не масштабится :-(
|
: Март 10, 2021, 11:37
|
Я и предлагаю этот цикл распаралеллить на все 4 ядра. Каждое посчитает свою 1/4 итераций. При 4-х ядрах не в 4 конечно, но раза в 2 как минимум должен быть прирост. И после окончания потоков слить полученные 4 результата в один вектор, который и запулить на ГПУ.
|
|
|
40
|
Qt / Многопоточное программирование, процессы / Re: Не масштабится :-(
|
: Март 09, 2021, 13:51
|
Я имел ввиду не шарить один вектор на 4 потока/ядра, а каждый поток делает свой локальный вектор, и его посылает на GPU, или куда там еще.
Шарить надо контекст, просто так посылать из др нитки (не главной где контекст создан) = отлуп/ошибка. Ну и шансов на ускорение немного, ведь N ниток льют "в одну дырочку". Вообще мне кажется неверным пытаться в данном случае что-то делать "руками", здесь явно нужна "современная технология" (о которых так любят говорить ) Затык, я так понимаю в расчетах, а не в "дырочке". std::vector<Vec3> CPolySDS::CalcVerNormals( const std::vector<Vec3> & pos, size_t startIndx, size_t endIndx) const { std::vector<Vec3> dst(pos.size()); for (size_t i = startIndx; i < endIndx; i += mNumVerPerFace) ...... }
// На каждом ядре запустить CalcVerNormals(pos, 0, mNorIndex.size() / 4); CalcVerNormals(pos, (mNorIndex.size() / 4) + 1 , (mNorIndex.size() / 4) * 2); // и т.д.
|
|
|
42
|
Qt / Многопоточное программирование, процессы / Re: Не масштабится :-(
|
: Март 08, 2021, 17:23
|
Обязательно ли посылать полный вектор dst на видеокарту? Может разделить по ядрам и каждое ядро сформирует и отправит свой кусок вектора? Ещё неплохо было бы подумать насчёт оптимизации количества итераций? По опыту, могу сказать, что программная оптимизация не даёт вау-эффекта, а оптимизация на уровне бизнес логики может в десятки тысяч раз ускорить.
|
|
|
43
|
Программирование / С/C++ / Re: Итераторы
|
: Февраль 01, 2021, 09:20
|
Объявление template означает что можем подавать что угодно, во всяком случае - многое. Нет template говорит о том, что обработка переданных аргументов будет одинакова для разных типов. А внутренняя реализация обработки зависит от разработчика. Чем сильнее различается АПИ аргументов, тем больше будет геморроя при реализации.
|
|
|
45
|
Программирование / С/C++ / Re: Итераторы
|
: Январь 29, 2021, 13:14
|
Касательно начала темы, там только 2 типа, CData и CData* отделить одно от другого можно через std::is_pointer так же можно сравнить с нужным типом через std::is_same
|
|
|
|
|