gpt4 book ai didi

c++ - 没有g++优化,一个复杂的模板类函数失效

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:29 26 4
gpt4 key购买 nike

我正在创建一个浮点矩阵模板类。类声明如下所示,仅包含相关函数和成员。

// columns, rows
template <unsigned int c, unsigned int r>
class Matrix {
public:
Matrix(float value);

float& At(unsigned int x, unsigned int y);
float const& At(unsigned int x, unsigned int y) const;
template <unsigned int p> Matrix<p, r> MultipliedBy(Matrix<p, c> const& other);

private:
// column-major ordering
float data_[c][r];
}

上述每个函数的实现如下。

template <unsigned int c, unsigned int r>
Matrix<c, r>::Matrix(float value) {
std::fill(&data_[0][0], &data_[c][r], value);
}

template <unsigned int c, unsigned int r>
float& Matrix<c, r>::At(unsigned int x, unsigned int y) {
if (x >= c || y >= r) {
return data_[0][0];
}

return data_[x][y];
}

template <unsigned int c, unsigned int r>
float const& Matrix<c, r>::At(unsigned int x, unsigned int y) const {
if (x >= c || y >= r) {
return data_[0][0];
}

return data_[x][y];
}

template <unsigned int c, unsigned int r>
template <unsigned int p>
Matrix<p, r> Matrix<c, r>::MultipliedBy(Matrix<p, c> const& other) {
Matrix<p, r> result(0.0f);

for (unsigned int x = 0; x < c; x++) {
for (unsigned int y = 0; y < r; y++) {
for (unsigned int z = 0; z < p; z++) {
result.At(z, y) += At(x, y) * other.At(z, x);
}
}
}

return result;
}

现在,几行测试代码。

Matrix<4, 4> m1;

// m1 set to
//
// 1 2 3 4
// 5 6 7 8
// 9 10 11 12
// 13 14 15 16

Matrix<1, 4> m2;

// m2 set to
//
// 6
// 3
// 8
// 9

Matrix<1, 4> m3 = m1.MultipliedBy(m2);

这就是事情变得奇怪的地方。编译时(使用 g++)没有优化(-O0):

// m3 contains
// 0
// 0
// 0
// 0

使用任何优化(-O1-O2-O3):

// m3 contains
// 210
// 236
// 262
// 288

请注意,即使进行了优化,答案也不正确(已使用外部计算器验证)。所以我将其缩小到 MultipliedBy 中的这个调用:

Matrix<p, r> result(0.0f);

如果我以任何方式实例化 resultother 将失效(所有 data_ 值设置为 0.0f) .在分配/初始化result之前,other仍然有效(6, 3, 8, 9)。

值得注意的是,如果我将两个相同(方形)维度的矩阵相乘,无论优化级别如何,我都会得到一个完全有效且正确的输出。

任何人都知道 g++ 到底在拉什么?我在 mingw 上运行 g++ (GCC) 4.6.1...这可能与问题有关吗?

最佳答案

&data_[c][r] 可能是错误的:它是 data_ + (c*r + r) * FS,而您可能需要 &data_[ c-1][r-1] + FS,即 data_ + ((c-1)*r + (r-1) + 1) * FS,即 data_ + c*r * FS.

(此处 FS == sizeof(float)。)

您的最后一项是 data_[c-1][r-1],所以最后一项是 data_[c-1][r],而不是数据_[c][r]

关于c++ - 没有g++优化,一个复杂的模板类函数失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com