【发布时间】:2017-12-22 22:44:02
【问题描述】:
我对 C++ 还很陌生,因此如果这是一个愚蠢的问题,请原谅,但我没有在互联网上找到我正在寻找的好例子。
基本上,我使用 parallel_for 循环来查找 2D 数组中的最大值(以及介于两者之间的一堆其他操作)。首先我什至不知道这是否是最好的方法,但考虑到这个二维数组的长度,我认为拆分计算会更快。
我的代码:
vector<vector<double>> InterpU(1801, vector<double>(3601, 0));
Concurrency::parallel_for(0, 1801, [&](int i) {
long k = 0; long l = 0;
pair<long, long> Normalized;
double InterpPointsU[4][4];
double jRes;
double iRes = i * 0.1;
double RelativeY, RelativeX;
int p, q;
while (iRes >= (k + 1) * DeltaTheta) k++;
RelativeX = iRes / DeltaTheta - k;
for (long j = 0; j < 3600; j++)
{
jRes = j * 0.1;
while (jRes >= (l + 1) * DeltaPhi) l++;
RelativeY = jRes / DeltaPhi - l;
p = 0;
for (long m = k - 1; m < k + 3; m++)
{
q = 0;
for (long n = l - 1; n < l + 3; n++)
{
Normalized = Normalize(m, n, PointsTheta, PointsPhi);
InterpPointsU[p][q] = U[Normalized.first][Normalized.second];
q++;
}
p++;
}
InterpU[i][j] = bicubicInterpolate(InterpPointsU, RelativeX, RelativeY);
if (InterpU[i][j] > MaxU)
{
SharedDataLock.lock();
MaxU = InterpU[i][j];
SharedDataLock.unlock();
}
}
InterpU[i][3600] = InterpU[i][0];
});
您可以在这里看到我使用了一个名为SharedDataLock 的mutex 来保护访问同一资源的多个线程。 MaxU 是一个变量,应该只包含 InterpU 向量的最大值。
该代码运行良好,但由于我遇到速度性能问题,我开始研究atomic 和其他一些东西。
有没有什么好的例子可以说明如何修改类似的代码以使其更快?
【问题讨论】:
-
没有必要共享
MaxU变量。每个线程应该在它的向量范围中找到最大值,然后你需要在线程结果中找到最大值。 -
看看
std::atomic。它是另一种同步工具。 -
您的代码不完整,请发布一个完整的示例来描述您的问题...无论如何,您可以通过使用原子操作来避免锁定。
-
您是否考虑过将
combinable用于MaxU?即每个线程都有自己的最大值,稍后使用max组合。 -
@VTT 最后我需要一个包含所有数据的向量和一个最大值来规范化它。
标签: c++ multithreading performance mutex ppl