C++对矢量中的一个矢量进行矢量化
C++ vectorizing a vector of vectors
我有一些代码使用vector<vector<>>
来存储计算结果。
通过基准测试,我发现这阻止了我的代码向量化,即使我使用适当的C三叉戟访问元素。
我正在尝试提出一种数据结构,它将向量化并提高代码的性能。
我在这里读了几篇文章,其中几篇提到创建一个类,该类内部有两个独立的向量:1个用于连续存储数据,另一个用于存储索引,该索引标记原始2D vector<vector>
的新列/行的开始。从本质上讲,它将把2D数组分解为1D,并使用"辅助"向量来进行适当的索引。
我担心的是,我还读到矢量化通常不会在这样的间接索引中发生,比如在稀疏矩阵的常见压缩行存储方案中。
在我完成所有的实施工作之前,有人以前遇到过这个问题并解决了它吗?还有其他可以帮助的建议或资源吗?
我写了一个基于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%清楚的,如果你的行有不同的大小,那么访问模式就有点复杂了。
附言:我不想再改变答案了,但我再也不会用std::vector
来构造矩阵了。向量提供了矩阵所不需要的灵活性,矩阵通常在每行中有相同且固定数量的条目。
相关文章:
- 普通环路未使用gcc 4.8.5自动矢量化
- 阵列火矢量化
- 使用矢量化c++的矩阵乘法
- 循环中标量乘积的自动矢量化
- 如何在clang++中禁用矢量化
- 加权外积的矢量化
- 手动矢量化/SSE 用于 C++ 中的复杂问题
- 包含比较的循环的自动矢量化
- pcl_ros::transformPointCloud的矢量化
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- (如何)我可以使用openmp矢量化"std::complex<double>"吗?
- C 矩阵乘法自动矢量化
- 矢量化 :乘以_m256i元素
- 是否可以使用 SSE 对此嵌套进行矢量化?
- 为什么内联函数中的循环无法正确自动矢量化
- 是否保证 OpenMP 矢量化
- AVX,SSE总和比gcc自动矢量化慢
- 嵌套矢量化 OpenMP 循环,在最内层循环中具有多行代码
- 模乘法的矢量化
- C++对矢量中的一个矢量进行矢量化