我有一个具有如下所示一般结构的程序。基本上,我有一个对象向量。每个对象都有成员向量,其中一个是包含更多向量的结构向量。通过多线程,对象被并行操作,进行涉及大量访问和修改成员向量元素的计算。一个对象一次只能被一个线程访问,并被复制到该线程的堆栈中进行处理。
问题是该程序无法扩展到 16 个内核。我怀疑并被告知问题可能是错误共享和/或缓存失效。如果这是真的,那么原因似乎一定是向量分配的内存彼此太近,因为据我了解,这两个问题(简单来说)都是由不同处理器同时访问的近端内存地址引起的。这种推理是否有意义,这可能会发生吗?如果是这样,我似乎可以通过使用 .reserve() 填充成员向量来增加额外的容量来解决这个问题,在向量数组之间留下大量的空内存空间。那么,这一切有意义吗?我完全出去吃午饭了吗?
struct str{
vector <float> a; vector <int> b; vector <bool> c; };
class objects{
vector <str> a; vector <int> b; vector <float> c;
//more vectors, etc ...
void DoWork(); //heavy use of vectors
};
main(){
vector <object> objs;
vector <object> p_objs = &objs;
//...make `thread_list` and `attr`
for(int q=0; q<NUM_THREADS; q++)
pthread_create(&thread_list[q], &attr, Consumer, p_objs );
//...
}
void* Consumer(void* argument){
vector <object>* p_objs = (vector <object>*) argument ;
while(1){
index = queued++; //imagine queued is thread-safe global
object obj = (*p_objs)[index]
obj.DoWork();
(*p_objs)[index] = obj;
}