y****k 发帖数: 71 | 1 【 以下文字转载自 Programming 讨论区 】
发信人: ystdpk (ystdpk), 信区: Programming
标 题: c++ thread 求助
发信站: BBS 未名空间站 (Fri Jan 31 21:12:20 2014, 美东)
有一个50 million 行的文本。每行四列数字。
要求每行求一个特殊函数的值,把此值输出为第五列。次函数的求值所花的时间可能很
快,如果四个数比较小, 也可能要花到10几到100倍的时间如果数比较大。
想用36个boost thread。
有没有人能提供一个boost thread 的代码。谢谢了。
我写了一个下面的,但是cpu浪费比较严重,有的thread 结束早,有的结束慢。而且不
知道2000行一个thread是不是好的选择。
int batchSize = 2000;
int num_of_lines = 50100100;
bool end_of_file = false;
int pstart = 0;
boost::thread_group io;
while( ! end_of_file )
{
boost::thread_group g;
vector > out;
out.resize(num_of_threads);
for( int i = 0; i < num_of_threads; )
{
if(num_of_lines - pstart < BATCHMAX)
{
batchSize = num_of_lines - pstart;
boost::thread *tp = new boost::thread( worker, batchSize
, boost::ref(out[i]) );
g.add_thread(tp);
pstart = pstart + batchSize;
i++;
end_of_file = true;
break;
}
else
{
boost::thread *tp = new boost::thread( worker, batchSize
, boost::ref(out[i]) );
g.add_thread(tp);
pstart = pstart + batchSize;
i++;
}
}
g.join_all();
io.join_all();
boost::thread *tprint = new boost::thread( appendToFile, boost::ref(File
), out);
io.add_thread(tprint);
} | a**x 发帖数: 14 | | M********u 发帖数: 42 | 3 假定输入是50m,每行4个数字,sizeof(double) * 4 =~ 32 bytes, 如果全部cache在
内存里,大概需要50m * 32 =~ 2GB。有的thread finish的比较早,有的比较晚是因为
每个thread分配到一样多的count,但是有的输入可能需要算很久。这类科学计算的问
题一般使用openmp,非常容易写。
http://en.wikipedia.org/wiki/OpenMP
可以用scheduling clause里的dynamic |
|