Я новичок в openMP, и я хотел бы просто написать три независимых блока параллельно.Я использовал структуру "сингл без ожидания".Переменные, как показано, являются независимыми.Тип "SpDoubleVec" и функции "transpose" и "prune" относятся к библиотеке Eigen.Код работает, но он не эффективен.Любой комментарий, чтобы ускорить?
SpDoubleVec x1, x2, x3, x4, b1, b2, b3, g1, g2, g3;
double lambda1, lambda2, lambda3;
double t1, t2, t3;
omp_set_num_threads(3);
#pragma omp parallel
{
#pragma omp single nowait
{
SpDoubleVec v1;
v1 = lambda1 * x1 + (1 - lambda1) * x2 - b1;
t1 = g1.transpose() * v1;
}
#pragma omp single nowait
{
SpDoubleVec v2;
v2 = lambda2 * x3 + (1 - lambda2) * zx4 - b2;
for (SpDoubleVec::InnerIterator it1(v2); it1; ++it1)
if (it1.value()< 0)
it1.valueRef() = 0;
v2.prune(0.0);
t2 = g2.transpose() * v2;
}
#pragma omp single nowait
{
SpDoubleVec v3;
v3 = b3 - lambda3 * x5 - (1 - lambda3) * x6;
for (SpDoubleVec::InnerIterator it2(v3); it2; ++it2)
if (it2.value()< 0)
it2.valueRef() = 0;
v3.prune(0.0);
t3 = g3.transpose() * v3;
}
}
t = t1 + t2 + t3;