由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Military版 - c++ thread 求助 (转载)
相关主题
生物 PHD 报个转码工的 offer (转载)19/100个主题在八卦文章和马伊俐:八大推论 (转载)
麻烦问一下各位版主:帖子被删的原因是?问个基本的军工问题,M12x1.75x40mm的攻丝螺丝哪里有卖
卡亚克桑请创作歌曲《怀仁堂之夜》湾区龟公龟婆流行搭伙过日子
这是个什么状况?别吵了,python就是个单机版的语言
其实最好是把好蛋猴妈请来当版主天涯都完蛋了,买卖提能不衰退么?
关于老毛的帖子,真是日经啊破熊变老将,战斗力还很强
我提议把thread在军版永久封存!大家看看一个自称狗家码农写的代码
thread的头像是谁?Re: 大家看看一个自称狗家码农写的代码 (转载)
相关话题的讨论汇总
话题: thread话题: boost话题: pstart话题: batchsize话题: file
进入Military版参与讨论
1 (共1页)
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);
}
P***y
发帖数: 2885
2
why not consider using Excel?

【在 y****k 的大作中提到】
: 【 以下文字转载自 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 结束早,有的结束慢。而且不

b*w
发帖数: 14917
3
用CUDA?
T*U
发帖数: 22634
4
perl

【在 y****k 的大作中提到】
: 【 以下文字转载自 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 结束早,有的结束慢。而且不

R****2
发帖数: 342
5
如果只做一次的话,为啥不把文件切割开然后同时开n个程序一起跑? 简单暴力高效
b***y
发帖数: 14281
6
没功夫看你的code,但是正确的做法不是平均分配任务给所有thread,而是所有thread
共享一个文件流,大家轮流一行行做,就不存在那个thread先结束的问题。
pseudo code大致如此
thread.run(file_handler) :
file_handler.lock()
while(file_handler)
{
job=file_handler.read_a_line()
file_handler.release()
do_some_time_consuming_things(job)
file_handler.lock()
}
file_handler.release()
return 0
main_thread()
{
file_handler=open_file(....)
...
for(i=0;i {
new_thread=thread()
new_thread.run(file_handler)
thread_list.append(new_thread)
}
for(i=0;i {
thread_list[i].join()
}
....
}

【在 y****k 的大作中提到】
: 【 以下文字转载自 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 结束早,有的结束慢。而且不

t*****g
发帖数: 1275
7
什么函数这么慢?确定瓶颈不在disk io?

【在 y****k 的大作中提到】
: 【 以下文字转载自 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 结束早,有的结束慢。而且不

y****k
发帖数: 71
8
非常感谢回复。真的学到东西了。
不过我还想问一下。
如果一次lock读入2000行会不会快点?
另外一个问题是,用这种方法有没有什么方法保证输出和原来的文本一样的顺序?

thread

【在 b***y 的大作中提到】
: 没功夫看你的code,但是正确的做法不是平均分配任务给所有thread,而是所有thread
: 共享一个文件流,大家轮流一行行做,就不存在那个thread先结束的问题。
: pseudo code大致如此
: thread.run(file_handler) :
: file_handler.lock()
: while(file_handler)
: {
: job=file_handler.read_a_line()
: file_handler.release()
: do_some_time_consuming_things(job)

y****k
发帖数: 71
9
what is CUDA?

【在 b*w 的大作中提到】
: 用CUDA?
y****k
发帖数: 71
10
必须是C++因为这个函数求解只在c++中有

【在 T*U 的大作中提到】
: perl
相关主题
关于老毛的帖子,真是日经啊19/100个主题在八卦文章和马伊俐:八大推论 (转载)
我提议把thread在军版永久封存!问个基本的军工问题,M12x1.75x40mm的攻丝螺丝哪里有卖
thread的头像是谁?湾区龟公龟婆流行搭伙过日子
进入Military版参与讨论
y****k
发帖数: 71
11
有不少步求积分

【在 t*****g 的大作中提到】
: 什么函数这么慢?确定瓶颈不在disk io?
r********n
发帖数: 7441
12
每个thread应该锁定一个block来处理,否则效率太低
36个thread根本没必要,4-8个就足够用了

thread

【在 b***y 的大作中提到】
: 没功夫看你的code,但是正确的做法不是平均分配任务给所有thread,而是所有thread
: 共享一个文件流,大家轮流一行行做,就不存在那个thread先结束的问题。
: pseudo code大致如此
: thread.run(file_handler) :
: file_handler.lock()
: while(file_handler)
: {
: job=file_handler.read_a_line()
: file_handler.release()
: do_some_time_consuming_things(job)

y****k
发帖数: 71
13
block该选多大有啥说法吗?

【在 r********n 的大作中提到】
: 每个thread应该锁定一个block来处理,否则效率太低
: 36个thread根本没必要,4-8个就足够用了
:
: thread

t*****g
发帖数: 1275
14
如果算比读还慢,起上N个thread(N=#core),每个thread死循环处理读上来的下一行。

【在 y****k 的大作中提到】
: 有不少步求积分
y****k
发帖数: 71
15
再顶这个问题:
有没有什么方法保证输出和原来的文本一样的顺序?
b***y
发帖数: 14281
16
取决于算一次用多少时间,如果一次计算用秒以上的时间的话则没多少区别,如果算一
次还是比较快的话可以一次抓个几十行来提高效率。这是很显然的事情吧。

【在 r********n 的大作中提到】
: 每个thread应该锁定一个block来处理,否则效率太低
: 36个thread根本没必要,4-8个就足够用了
:
: thread

a*i
发帖数: 126
17
读一行,attach 一个行号。
输出都丢到一个buffer里 (linked-list?),再起一个thread 作输出。

【在 y****k 的大作中提到】
: 再顶这个问题:
: 有没有什么方法保证输出和原来的文本一样的顺序?

b***y
发帖数: 14281
18
Good solution. Just make sure to lock the index properly when reading the
file.

【在 a*i 的大作中提到】
: 读一行,attach 一个行号。
: 输出都丢到一个buffer里 (linked-list?),再起一个thread 作输出。

y****k
发帖数: 71
19
大牛们,
可不可以讲一下这个attach 是什么意思。
linked list 又如何通过行号保持原来的顺序。是等所有的计算结束了再输出这个排序
了的list吗?
求详细点解释。

【在 b***y 的大作中提到】
: Good solution. Just make sure to lock the index properly when reading the
: file.

a*i
发帖数: 126
20
attach 没啥特别的意思。
把读入的每一行当作一个object对待。这个object还有一些fields可以hold行号和运算
结果。
给行号的index是全局递增的变量,所以不同的thread access的时候要注意lock.
兄弟还在学校吧?这都是工业界常规solution。不牛。

【在 y****k 的大作中提到】
: 大牛们,
: 可不可以讲一下这个attach 是什么意思。
: linked list 又如何通过行号保持原来的顺序。是等所有的计算结束了再输出这个排序
: 了的list吗?
: 求详细点解释。

相关主题
别吵了,python就是个单机版的语言大家看看一个自称狗家码农写的代码
天涯都完蛋了,买卖提能不衰退么?Re: 大家看看一个自称狗家码农写的代码 (转载)
破熊变老将,战斗力还很强个人认为组装一把budget
进入Military版参与讨论
b*w
发帖数: 14917
21
GPU的并行处理更快吧

【在 y****k 的大作中提到】
: what is CUDA?
b*w
发帖数: 14917
22
另外创建thread的数目时,也要考虑CPU本身有几个虚拟的processors,太多threads不
一定能提高效率
y****k
发帖数: 71
23
不好意思。的确在学校。
我的想法是建立一个map KeyLineNum_ValueOutput.
只要定义好了 < operator, 这个就是自动安LineNum排序的。 等所有行都处理完了就
可以输出了。不过这样搞感觉浪费内存。
不是很明白这个linked list 可以如何一边计算一边保持原来的顺序用一个thread输出

【在 a*i 的大作中提到】
: attach 没啥特别的意思。
: 把读入的每一行当作一个object对待。这个object还有一些fields可以hold行号和运算
: 结果。
: 给行号的index是全局递增的变量,所以不同的thread access的时候要注意lock.
: 兄弟还在学校吧?这都是工业界常规solution。不牛。

h******k
发帖数: 13418
24
需要两个buffer,一个io thread,总thread不超过总vcpu,thread全部bind
a*i
发帖数: 126
25
对,这个map只能保证有序,不能保证连续。
只有都处理完,才能保证连续.
Linked list 的意思就是每个thread输出结果时,自己保证有序插入.
不过, 我觉得你的map比list 好, 这个buffer用map比较好。

【在 y****k 的大作中提到】
: 不好意思。的确在学校。
: 我的想法是建立一个map KeyLineNum_ValueOutput.
: 只要定义好了 < operator, 这个就是自动安LineNum排序的。 等所有行都处理完了就
: 可以输出了。不过这样搞感觉浪费内存。
: 不是很明白这个linked list 可以如何一边计算一边保持原来的顺序用一个thread输出

l*********u
发帖数: 19053
26
有。divide and conquer
split出来的小files是按字母排的,算好后再按字母cat回去。

【在 y****k 的大作中提到】
: 再顶这个问题:
: 有没有什么方法保证输出和原来的文本一样的顺序?

1 (共1页)
进入Military版参与讨论
相关主题
Re: 大家看看一个自称狗家码农写的代码 (转载)其实最好是把好蛋猴妈请来当版主
个人认为组装一把budget关于老毛的帖子,真是日经啊
比get out强我提议把thread在军版永久封存!
美轮美奂Phantomthread的头像是谁?
生物 PHD 报个转码工的 offer (转载)19/100个主题在八卦文章和马伊俐:八大推论 (转载)
麻烦问一下各位版主:帖子被删的原因是?问个基本的军工问题,M12x1.75x40mm的攻丝螺丝哪里有卖
卡亚克桑请创作歌曲《怀仁堂之夜》湾区龟公龟婆流行搭伙过日子
这是个什么状况?别吵了,python就是个单机版的语言
相关话题的讨论汇总
话题: thread话题: boost话题: pstart话题: batchsize话题: file