C++ 加速循环。向后推

C++ 加速循环。向后推,c++,visual-studio-2013,openmp,C++,Visual Studio 2013,Openmp,我想知道我们是否可以使用OpenMP或CUDA来加速这个循环。目前,它在顺序处理方面运行良好,但我正在尝试优化我的编码: for (int curCol = 0; curCol < numRows; ++curCol){ //Long Loop int lb = csc_colIndices[curCol]; int ub = csc_colIndices[curCol + 1]; // push back the diagonal

我想知道我们是否可以使用OpenMP或CUDA来加速这个循环。目前,它在顺序处理方面运行良好,但我正在尝试优化我的编码:

for (int curCol = 0; curCol < numRows; ++curCol){     //Long Loop
        int lb = csc_colIndices[curCol];
        int ub = csc_colIndices[curCol + 1];

        // push back the diagonal value to L matrix
        vec_L_val[curCol].push_back(1.0f);
        vec_L_indices[curCol].push_back(curCol);

        for (int curIndex = lb; curIndex < ub; ++curIndex){
            int curRow = csc_indices[curIndex];
            float curVal = csc_val[curIndex];

            if (!Equal(curVal, 0) && curRow <= curCol){// U entry
                vec_U_val[curCol].push_back(curVal);
                vec_U_indices[curCol].push_back(curRow);
            }
            else if (!Equal(curVal, 0) && curRow > curCol){// L entry
                vec_L_val[curCol].push_back(curVal);
                vec_L_indices[curCol].push_back(curRow);
            }
        }
    }
我的怀疑是使用了。推开你,但我可能错了


如何改进此代码?

首先预告整个代码:

for (int curCol = 0; curCol < numRows; ++curCol)
{
    vec_L_val[curCol].resize( SIZE_OF_THE_INNER_VECTOR );
    vec_L_indices[curCol].resize( SIZE_OF_THE_INNER_VECTOR );
    vec_U_val[curCol].resize(SIZE_OF_THE_INNER_VECTOR )
    vec_U_indices[curCol].resize(SIZE_OF_INNER_VECTOR )
}
for(int curCol=0;curCol
这样,您的内部循环可能工作得更快,因为在内部向量结构中不需要realloc

for (int curCol = 0; curCol < numRows; ++curCol){     //Long Loop
    int lb = csc_colIndices[curCol];
    int ub = csc_colIndices[curCol + 1];

    // push back the diagonal value to L matrix
    vec_L_val[curCol].push_back(1.0f);
    vec_L_indices[curCol].push_back(curCol);

    for (int curIndex = lb; curIndex < ub; ++curIndex){
        int curRow = csc_indices[curIndex];
        float curVal = csc_val[curIndex];

        if (!Equal(curVal, 0) && curRow <= curCol){// U entry
            vec_U_val[curCol].push_back(curVal);
            vec_U_indices[curCol].push_back(curRow);
        }
        else if (!Equal(curVal, 0) && curRow > curCol){// L entry
            vec_L_val[curCol].push_back(curVal);
            vec_L_indices[curCol].push_back(curRow);
        }
    }
}
for(int-curCol=0;curCol
您是否给了向量一个初始大小?您是指vec_L_val之类的吗?如果是的话,是的。填充
std::vector
s对于并行性来说不是一个合适的应用程序,因为多个线程将在同一时间竞争资源。我将把填充作为一个顺序操作,而集中精力在leveragin上当你以后不修改处理这些向量时,并行性。我明白了。谢谢你的解释。主要的是,这是我的程序的一个剩余部分,它有一个瓶颈,这就是我正在处理它的原因。
shared(curIndex)
肯定是错误的!(但实际上您还可以,因为您随后在现在的并行代码中适当地将其声明为本地)我明白了,我会尝试一下,谢谢你的建议。嗨,托玛兹,我尝试过你的解决方案,但它却使程序停止运行。尽管如此,谢谢你的建议!通过调整向量大小来停止运行?这只有在你没有内存处理数据的情况下才可能。
for (int curCol = 0; curCol < numRows; ++curCol){     //Long Loop
    int lb = csc_colIndices[curCol];
    int ub = csc_colIndices[curCol + 1];

    // push back the diagonal value to L matrix
    vec_L_val[curCol].push_back(1.0f);
    vec_L_indices[curCol].push_back(curCol);

    for (int curIndex = lb; curIndex < ub; ++curIndex){
        int curRow = csc_indices[curIndex];
        float curVal = csc_val[curIndex];

        if (!Equal(curVal, 0) && curRow <= curCol){// U entry
            vec_U_val[curCol].push_back(curVal);
            vec_U_indices[curCol].push_back(curRow);
        }
        else if (!Equal(curVal, 0) && curRow > curCol){// L entry
            vec_L_val[curCol].push_back(curVal);
            vec_L_indices[curCol].push_back(curRow);
        }
    }
}