2015-12-03 204 views
2

我有一些代碼使用vector<vector<>>來存儲計算結果。C++向量化矢量向量

通過基準測試,我發現這是防止我的代碼從矢量化,即使我正在訪問具有適當的C-stride的元素。

我試圖想出一個數據結構,它將矢量化和提高我的代碼的性能。

我在這裏讀了幾篇文章,其中有幾篇提到創建一個有兩個獨立向量的類:1個用於連續存儲數據,另一個用於存儲索引,標記新的列/行的開始原版2D vector<vector>。實質上,它會將2D數組分解爲1D,並使用「助手」向量來進行適當的索引。

我的問題是,我也讀過這樣的矢量化,通常不會像間接索引那樣發生,例如稀疏矩陣的常見壓縮行存儲方案。

在我完成所有這些工作之前,有沒有人遇到過這個問題並解決了它?任何其他建議或資源可以幫助嗎?

+0

你是什麼意思的「......用適當的C-stride訪問元素」?我無法想象你如何定義一個「矢量」的步幅。 – anatolyg

+0

@anatolyg我只是想知道同樣的。然而,我不知道什麼是C-stride將會是一般的 – user463035818

+0

通過C-stride,我的意思是遍歷第二個索引,然後是第一個索引。所以我基本上是迭代一個內部向量的所有元素,然後再進入下一個向量。由於矢量數據在內存中是連續的,並且由於我按順序遍歷所有元素,所以我應該得到矢量化,但我不是。我添加了跨步評論,因爲我閱讀的幾篇文章有人循環錯誤,並從每個內部向量中取一個元素,這真的搞砸了他們的緩存加載。我想避免人們提供這種類型的答案,因爲它不適用於我。 – BlackBelt2025

回答

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構造一個矩陣。向量提供了矩陣不需要的靈活性,矩陣通常在每一行中具有相同和固定數量的條目。

+0

非常感謝!這是一個非常好的起點,當我在測試問題上運行你的課程時,我實現了矢量化! – BlackBelt2025