Я новичок в 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];
});
Здесь вы можете видеть, что я использую mutex
с именем SharedDataLock
для защиты нескольких потоков, обращающихся к одному и тому же ресурсу. MaxU
— это переменная, которая должна содержать максимум вектора InterpU
. Код работает хорошо, но так как у меня проблемы со скоростью работы, я начал изучать atomic
и некоторые другие вещи.
Есть ли хороший пример того, как изменить аналогичный код, чтобы сделать его быстрее?
MaxU
. Каждый поток должен найти максимум среди своего диапазона векторов, а затем вам нужно найти максимум среди результатов потока. - person user7860670   schedule 18.07.2017std::atomic
. Это еще один инструмент для синхронизации. - person OutOfBound   schedule 18.07.2017combinable
вместоMaxU
? т. е. каждый поток имеет свое максимальное значение, которое позже объединяется с помощьюmax
. - person Hasturkun   schedule 18.07.2017