C ++矢量化矢量矢量

时间:2015-12-03 18:28:50

标签: c++ optimization vector vectorization

我有一些代码使用vector<vector<>>来存储计算结果。

通过基准测试,我发现即使我使用适当的C-stride访问元素,这也会阻止我的代码进行矢量化。

我正在努力想出一个能够矢量化并提高代码性能的数据结构。

我在这里读了几篇文章,其中有几篇提到创建一个内部有2个独立向量的类:1用于连续存储数据,另一个用于存储索引,用于标记原始新列/行的开头2D vector<vector>。基本上,它会将2D数组分解为1D,并使用“辅助”向量来进行正确的索引。

我担心的是,我还读到了这样的间接索引通常不会发生矢量化,例如稀疏矩阵的常见压缩行存储方案。

在我完成所有实现这项工作之前,有没有人遇到过这个问题并解决了它?还有其他可能有用的建议或资源吗?

1 个答案:

答案 0 :(得分:1)

我写了一个基于std::vector的小矩阵类:

#include <vector>

template <typename T>
class MyMatrix {
    public:

    typedef T value_type;
    struct RowPointer {
        int row_index;
        MyMatrix* parent;
        RowPointer(int r,MyMatrix* p) : row_index(r),parent(p) {}
        T& operator[](int col_index) { 
            return parent->values[row_index*parent->cols+col_index];
        }
    };
    MyMatrix() : rows(0),cols(0),size(0),values(){}
    MyMatrix(int r,int c) : rows(r),cols(c),size(r*c),values(std::vector<T>(size)){}
    RowPointer operator[](int row_index){return RowPointer(row_index,this);}

    private:

    size_t rows;
    size_t cols;
    size_t size;
    std::vector<T> values;
};

可以像这样使用:

MyMatrix<double> mat = MyMatrix<double>(4,6);
mat[1][2] = 3;
std::cout << mat[0][0] << " " << mat[1][2] << std::endl;

它仍然缺少很多东西,但我认为这足以说明扁平化矩阵的想法。从你的问题来看,它不是100%清楚,如果你的行有不同的大小,那么访问模式会有点复杂。

PS:我不想再改变答案,但我绝不会再使用std::vector来构建矩阵。向量提供矩阵不需要的灵活性,矩阵通常在每行中具有相同且固定数量的条目。