Автор: GeorgeMame
Дата сообщения: 01.08.2015 18:13
[more] [more] [more] Сначала не нашел этой темы и поэтому "залез" в Фортран, хотя пишу на C.
У меня основной алгоритм последовательный, т.е. не распараллеливается, и при этом выдает последовательно числа, каждое из которых независимо от основного алгоритма обрабатывается другим алгоритмом, который "завязан" только на это число и на числовую информацию, которая занимает немного места в памяти, известна до применения нового алгоритма и при этом одна и та же для всех чисел, выдаваемых первым алгоритмом. При этом числа, выдаваемые последовательно основным алгоритмом, второй алгоритм модифицирует. Не подскажите, как грамотно задействовать остальные ядра, чтобы они не простаивали. Идея понятна: размножить числовую информацию, которая занимает немного места в памяти, в количестве, равном числу оставшихся ядер, а вот как дальше действовать? Вопрос стал ребром на процессорах с архитектурой haswell, т.к. скорость счета с помощью новых команд FMA (+=a*b) увеличилась по сравнению с SSE (вплоть до последних версий SSE) в 4 раза. Это легко проверить: у меня два 6-ти ядерных процессора - Intel® Core™ i7-980 Processor (12M Cache, 3.33 GHz) и Intel® Core™ i7-5820K Processor (15M Cache, 3.33 GHz). Так вот второй перемножает две матрицы 10000*10000 в четыре раза быстрее (7.0 с. и 29.3 с.). При этом использовалась функция перемножения матриц dgemm из пакета Intel MKL. Пользуюсь интеловским компилятором и соответственно OpenMP. Дело в том, что основной алгоритм выдает числа не регулярно и надо отслеживать освободившиеся ядра или ставить в очередь, если все ядра заняты. Но вот куда в очередь поставить, чтобы алгоритм работал как можно эффективней, если все ядра заняты, не совсем понятно.
P.S.
Частично ответ получил в теме, посвященной Фортрану, но может быть еще что-либо дельное услышу. [/more] [/more] [/more]