由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 一个多线程的简单问题
相关主题
贡献T家新鲜面经,求个bless考古到一道题
median of N^2 numbers across N machines问一个多次遇到的面试题
简单map reduce mean median, 傻逼回答C++里面关于多线程应该怎么掌握啊?
求教一道面试题再问一道题
unordered_set是怎么实现的?请教一道算法题
一道Iterator题问道关于快速找bucket的面试题
问个大数据处理的面试题请教最优算法:最多装满水的桶?
请教大侠们hash table 多线程问题web count 设计
相关话题的讨论汇总
话题: bucket话题: thread话题: 线程话题: 数组话题: 多线程
进入JobHunting版参与讨论
1 (共1页)
k***g
发帖数: 166
1
一大堆数,要按照第一位拷贝到不同的int array里面,比如:
[37, 57, 653, 12, 52, 501, 91, ...]
->
Bucket 1: [12]
Bucket 3: [37]
Bucket 5: [57, 52, 501]
Bucket 6: [653]
Bucket 9: [91]
考虑用多线程来提高效率
想了两个办法:
1. 把数组分成8等份,用8个线程同时做。问题是写入buckets的时候会引发大量锁操作
2. 用9个线程,各自负责一个bucket,看起来貌似就不需要锁了,不知道是否够快
还有更好的办法吗?
t**r
发帖数: 3428
2
数据 特别大 可以考虑mapreduce.
否则就你说的地二种方法不錯阿
k***g
发帖数: 166
3
又想到一个办法。还是把数组分成8等份,用8个线程同时做,和第一种方法的区别是它
们把数据放到自己的小桶里面。都完成之后,再把这些小桶连接起来。
这个要用C++实现,传进来的是一个vector。还没想好桶用什么数据结构
如果也用vector或者list,感觉会慢,因为要在堆上分配大量的内存才行
h*******e
发帖数: 1377
4
vector 的push_back 不是thread safe么原子操作吗?
a*****s
发帖数: 1121
5
并行计算需要考虑两个因素,数据依赖和流程依赖,你这个例子有数据依赖,没有流程
依赖。
简单来讲,避免多对多的通信,可以用数据复制来减少通信,每个thread有一份所有数
据的拷贝,第一个thread做数组1,第二个thread座数组2,以此类推,最后大家各自输
出各自的;performance瓶颈在你的最慢的thread上
如果不在乎通信,那就分数据,每个thread编号,每个进程都计算出自己的总结果,一
号负责收集最后的数组1,二号thread负责收集数组2,以此类推,bottleneck在最慢的
thread和最慢的网络,两者去最大值。这个就是mapreduce的做法。
a*****s
发帖数: 1121
6
再复杂的话,只有这两个基本解法的融合,根据你自己系统的硬件条件来决定,因为计
算量不大,不需要GPU,如果算法复杂度大的话,可以在二级并行上使用GPU。

【在 a*****s 的大作中提到】
: 并行计算需要考虑两个因素,数据依赖和流程依赖,你这个例子有数据依赖,没有流程
: 依赖。
: 简单来讲,避免多对多的通信,可以用数据复制来减少通信,每个thread有一份所有数
: 据的拷贝,第一个thread做数组1,第二个thread座数组2,以此类推,最后大家各自输
: 出各自的;performance瓶颈在你的最慢的thread上
: 如果不在乎通信,那就分数据,每个thread编号,每个进程都计算出自己的总结果,一
: 号负责收集最后的数组1,二号thread负责收集数组2,以此类推,bottleneck在最慢的
: thread和最慢的网络,两者去最大值。这个就是mapreduce的做法。

h*******e
发帖数: 1377
7
为啥要lock 数字入哪个 bucket 不会错啊, 可能出错的是入bucket 的顺序, 可是那
个重要吗, 线程本来就不能guarentee顺序啊。

【在 k***g 的大作中提到】
: 一大堆数,要按照第一位拷贝到不同的int array里面,比如:
: [37, 57, 653, 12, 52, 501, 91, ...]
: ->
: Bucket 1: [12]
: Bucket 3: [37]
: Bucket 5: [57, 52, 501]
: Bucket 6: [653]
: Bucket 9: [91]
: 考虑用多线程来提高效率
: 想了两个办法:

l********6
发帖数: 129
8
thread safe? sure?

【在 h*******e 的大作中提到】
: vector 的push_back 不是thread safe么原子操作吗?
h*******e
发帖数: 1377
9
python append 是原子操作。 那 c++ stl push_back 可能不是吧。
k**l
发帖数: 2966
10
如果方法1的话,可以用 compare and swap 实现 vector 添加的原子操作。

【在 k***g 的大作中提到】
: 一大堆数,要按照第一位拷贝到不同的int array里面,比如:
: [37, 57, 653, 12, 52, 501, 91, ...]
: ->
: Bucket 1: [12]
: Bucket 3: [37]
: Bucket 5: [57, 52, 501]
: Bucket 6: [653]
: Bucket 9: [91]
: 考虑用多线程来提高效率
: 想了两个办法:

k**l
发帖数: 2966
11
python 有多线程么,我好久不用了

【在 h*******e 的大作中提到】
: python append 是原子操作。 那 c++ stl push_back 可能不是吧。
a*******o
发帖数: 129
12
为啥要lock,读操作不需要锁,而且每个数只能归类到一个bucket,怎么都用不上锁呀。
如果数组很长,应该可以把它分成很多块,9个线程work一个块,那样就会更快了。
这样理解对吗?
1 (共1页)
进入JobHunting版参与讨论
相关主题
web count 设计unordered_set是怎么实现的?
一道巨常见的题一道Iterator题
问道大数据的题问个大数据处理的面试题
Groupon电面请教大侠们hash table 多线程问题
贡献T家新鲜面经,求个bless考古到一道题
median of N^2 numbers across N machines问一个多次遇到的面试题
简单map reduce mean median, 傻逼回答C++里面关于多线程应该怎么掌握啊?
求教一道面试题再问一道题
相关话题的讨论汇总
话题: bucket话题: thread话题: 线程话题: 数组话题: 多线程