【发布时间】:2016-12-14 19:30:57
【问题描述】:
我想并行化一个循环(使用tbb),其中包含一些昂贵但可矢量化的迭代(随机分布)。我的想法是缓冲它们并在达到矢量大小时刷新缓冲区。这样的缓冲区必须是线程本地的。例如,
// dummy for testing
void do_vectorized_work(size_t k, size_t*indices)
{}
// dummy for testing
bool requires_expensive_work(size_t k)
{ return (k&7)==0; }
struct buffer
{
size_t K=0, B[vector_size];
void load(size_t i)
{
B[K++]=i;
if(K==vector_size)
flush();
}
void flush()
{
do_vectorized_work(K,B);
K=0;
}
};
void do_work_in_parallel(size_t N)
{
tbb::enumerable_thread_specific<buffer> tl_buffer;
tbb::parallel_for(size_t(0),N,[&](size_t i)
{
if(requires_expensive_work(i))
tl_buffer.local().load(i);
});
}
但是,这会使缓冲区不为空,所以我仍然需要最后一次刷新每个缓冲区
for(auto&b:tl_buffer)
b.flush();
但这是连续剧!当然,我也可以尝试并行这样做
using tl_range = typename tbb::enumerable_thread_specific<buffer>::range_type;
tbb::parallel_for(tl_buffer.range(),[](tl_range const&range)
{
for(auto r:range)
r->flush();
});
但我不确定这是否有效(因为缓冲区的数量与线程的数量一样多)。我想知道是否有可能在事件发生后避免最后的冲洗。 IE。是否可以使用tbb::tasks(替换tbb::parallel_for)以使每个线程的最终任务是刷新其缓冲区?
【问题讨论】:
标签: c++ multithreading parallel-processing tbb