В настоящее время у меня есть блок кода, подобный этому
UINT8* u = getResult();
for (UINT64 counter = 0; counter < MaxCount; counter++)
{
for (UINT64 index = 0; index < c_uOneMB; ++index)
{
*u++ = genValue();
}
}
Теперь для того, чтобы сделать это работать быстрее. Я делаю что-то вроде этого. В основном разделение внутреннего потока на метод. Однако у меня есть две проблемы, которые я не знаю, как решить.
Любые предложения о том, как это сделать?
void doSomething(UINT8* u)
{
for (UINT64 index = 0; index < c_uOneMB; ++index)
{
*u++ = genValue();
}
}
UINT8* u = getResult();
for (UINT64 counter = 0; counter < MaxCount; counter++)
{
std::thread t(doSomething,u);
}
doSomethingElse();
почему две петли for
в первом примере? Почему не один цикл, который повторяется MaxCount * c_uOneMB
раз? Второй пример не эквивалентен первому, один поток переопределяет результаты другого.
@MarekR это имеет смысл. В таком случае, как мне сделать это быстрее.
1. код профиля 2. Уменьшить временную сложность кода, который оказался медленным. 3. используйте потоки в крайнем случае. Мы не можем помочь, так как вы не предоставили важных деталей.
Best way to parallize this for loop with multiple threads
Способ Лучший зависит от многих факторов и является субъективным. На самом деле иногда (возможно, в большинстве случаев) непараллелизованный код работает быстрее. Если скорость важнее всего, то лучший способ — это то, что вы считаете самым быстрым.
Использование алгоритмов стандартной библиотеки обычно не вызывает затруднений:
std::generate_n(
std::execution::par_unseq,
u,
MaxCount * c_uOneMB,
genValue);
Тот же комментарий, что и в другом ответе: предполагается, что параллельный STL поддерживается (Clang еще нет).
С небольшими подробностями, которые вы предоставили, я могу дать только это:
std::generate_n(std::execution::par, getResult(), MaxCount * c_uOneMB, genValue);
Обратите внимание, что это предполагает, что параллельный STL поддерживается, что не относится ко всем компиляторам. Clang, например, пока не поддерживает его, к сожалению.
@JérômeRichard, он был помечен как C++17, поэтому использование функции заголовка C++17 допустимо.
Хотелось бы знать, почему проголосовали за закрытие?