我正在尝试在 C++ 中创建一个多线程的 for 循环,以便将计算划分为多个线程。然而,它包含需要按原样连接在一起的数据。
所以这个想法是首先加入许多核心(25.000+循环)上的小比特,然后在最后再次加入组合数据。
std::vector<int> ids; // mappings
std::map<int, myData> combineData; // data per id
myData outputData; // combined data based on the mappings
myData threadData; // data per thread
#pragma parallel for default(none) private(data, threadData) shared(combineData)
for (int i=0; i<30000; i++)
{
threadData += combineData[ids[i]];
}
// Then here I would like to get all the seperate thread data and combine them in a similar manner
// I.e.: for each threadData: outputData += threadData
解决这个问题的有效和好的方法是什么?
如何安排 openmp 循环,以便将调度平均分成块
例如对于 2 个线程: [0, 1, 2, 3, 4, .., 14999] & [15000, 15001, 15002, 15003, 15004, .., 29999]
如果有更好的方法来连接数据(包括将许多 std::vectors 连接在一起和一些矩阵数学),但保留指向它的添加指针的顺序也会有所帮助。
添加信息
- 加法是关联的,但不是可交换的。
- myData 不是内在类型。它是一个包含多个 std::vector 数据的类(以及一些与 Autodesk Maya API 相关的数据。)
- 每个循环都对许多点进行类似的矩阵乘法,并将这些点添加到向量中(理论上,每个循环的计算时间应该保持大致相似)
基本上,它是将网格数据(由数据向量组成)相互添加(组合网格),尽管整个事物的顺序考虑了顶点的索引值。顶点索引应该是一致的和可重建的。