Неэффективный openMP параллельный сингл - PullRequest
0 голосов
/ 06 октября 2018

Я новичок в 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;
...