如何在C ++中对for循环进行矢量化?

时间:2015-04-06 18:00:58

标签: c++ performance matlab memory vectorization

我是C ++的新手,所以我想知道是否可以在C ++中引导for循环。在Python,Matlab中,矢量化增加了性能,SIMD操作,我想知道这是否可以在C ++中实现?如果是这样的话?如果它很长,你能指点我一个教程吗?

template <class T>
matrix<T> matrix<T>::operator*( matrix<T> &rhs)
/*
    it takes the current matrix , multiplies it by the matrix on the right , and returns 
    a new matrix 
*/
{
    matrix<T> result(_rows,rhs._cols);

    if(_cols == rhs._rows ){
                for(long long  i = 1; i <= _rows ;i++){
                    for(long long  j = 1 ; j <= rhs._cols ; j++){
                        for(long long  k = 1; k <= _cols ; k++)
                            result(i,j) += get(i,k) * rhs(k,j);// get(i,k) gives the elements in the current matrix. 

                    }   
                }
        //}else error("Cols Does Not Match");
    }else error("Rows Does Not Match");

    return result ; 
}

我在我的类矩阵中做了更复杂的循环,如果你能给我一个关于如何进行矢量化的启发式算法,它会有很大的帮助。

旁注 - (我应该把它作为一个单独的问题吗?) 我将矩阵实现为1D std :: vector。对于30000 X 30000(10 ^ 8)的大小,我在VS中收到调试错误。我在网上搜索,发现std :: vector的限制为〜5000万。我如何支持更大尺寸的矩阵。 Matlab支持大约20亿(10 ^ 9)向量元素或更多。我可以在C ++中做些什么来获得相同的大小?我应该回到使用数组并自己进行内存分配吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

对于&#39;矢量化&#39;对于for循环,您可以使用OpenMP http://openmp.org/wp/或Intel TBB。

如果您不想自己实现基本数学函数,可以使用像Armadillo http://arma.sourceforge.net/这样的Math-Libs。他们正在为您做优化。