已经对同一问题发表了疑问,但我认为答案开始朝另一个方向发展,所以我会集中讨论我的问题:P
1)需要用一些数据填充一个hughe向量。为了提高速度,我想使用线程来完成工作,所以1个线程可以写入向量的前半部分而另一个线程写入后半部分。
由于每个线程正在访问向量的不同位置......我是否需要保护该访问?
换句话说,我可以同时在这个结构的两个不同位置写入而不保护它吗?
...
using namespace std;
...
main{
int n = 256x1024x1024;
vector<int> vec(n);
thread t1(fillFunction(std::ref(vector), 0, n/2);
thread t2(fillFunction(std::ref(vector), n/2, n);
t1.join;
t2.join;
}
fillFunction(vector<int> &vec, int first, int final){
int i;
for (i = first; i < final; i++){
vec[i] = some_data;
}
}
如果我必须保护访问权限,我应该使用lock_guard还是unique_lock?
2)这个线程解决方案真的会提高速度吗?
我的意思是,即使我保护着作,向量也足够大,不适合缓存。线程写在非常不同的位置,因此'for'将产生如此多的缓存未命中。
这些“缓存未命中”会导致执行速度比没有线程更慢吗?
制作1个线程来填充偶数,而另一个线程使用奇数可以减少缓存未命中数?
thread t1(fillFunction(std::ref(vector), 0, n/2);
thread t2(fillFunction(std::ref(vector), 1, n);
[...]
for (i = first; i < final; i = i+2){
vec[i] = some_data;
}
谢谢大家:)
答案 0 :(得分:1)
1)如果您保证写入不同的地址,则不需要保护矢量。
2)你真的只需要在你的确切机器上自己测试这些东西。尝试单线程与交叉存取访问与拆分访问,只需对结果进行计时。