将此 for 循环与多个线程并行化的最佳方法
Best way to parallelize this for loop with multiple threads
我目前有这样一个代码块
UINT8* u = getResult();
for (UINT64 counter = 0; counter < MaxCount; counter++)
{
for (UINT64 index = 0; index < c_uOneMB; ++index)
{
*u++ = genValue();
}
}
现在为了使这个 运行 更快。我正在做这样的事情。基本上将内线程拆分成一个方法。但是我有两个问题,我不确定如何解决。
- *u++ 我该如何处理?
- 在调用 doSomethingElse() 之前,所有线程都需要 .join()
关于如何实现这一点有什么建议吗?
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();
Best way to parallize this for loop with multiple threads
最佳 方式取决于许多因素并且是主观的。事实上,有时(也许大多数时候)non-parallelised 代码更快。如果速度最重要,那么最好的方法就是您测得最快的方法。
使用标准库算法通常很简单:
std::generate_n(
std::execution::par_unseq,
u,
MaxCount * c_uOneMB,
genValue);
根据你提供的细节,我只能给出这个:
std::generate_n(std::execution::par, getResult(), MaxCount * c_uOneMB, genValue);
我目前有这样一个代码块
UINT8* u = getResult();
for (UINT64 counter = 0; counter < MaxCount; counter++)
{
for (UINT64 index = 0; index < c_uOneMB; ++index)
{
*u++ = genValue();
}
}
现在为了使这个 运行 更快。我正在做这样的事情。基本上将内线程拆分成一个方法。但是我有两个问题,我不确定如何解决。
- *u++ 我该如何处理?
- 在调用 doSomethingElse() 之前,所有线程都需要 .join()
关于如何实现这一点有什么建议吗?
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();
Best way to parallize this for loop with multiple threads
最佳 方式取决于许多因素并且是主观的。事实上,有时(也许大多数时候)non-parallelised 代码更快。如果速度最重要,那么最好的方法就是您测得最快的方法。
使用标准库算法通常很简单:
std::generate_n(
std::execution::par_unseq,
u,
MaxCount * c_uOneMB,
genValue);
根据你提供的细节,我只能给出这个:
std::generate_n(std::execution::par, getResult(), MaxCount * c_uOneMB, genValue);