gpt4 book ai didi

c++ - 在 VS2015 中发布 x64 配置时的不同结果

转载 作者:行者123 更新时间:2023-11-28 02:04:51 25 4
gpt4 key购买 nike

我正在使用 VS2015 社区实现光线追踪程序。该程序填充屏幕尺寸颜色缓冲区(width * height,元素类型为 Eigen::Vector3f),然后将缓冲区内容保存到 ppm 文件。

基本循环(注意外循环末尾的输出部分):

using Vec3f = Eigen::Vector3f;

Vec3f * buffer = new Vec3f[w * h];

// for each pixel
for (int y = 0; y < h; y++) for (int x = 0; x < w; x++)
{
int const i = (h - y - 1) * w + x;
buffer[i] = Vec3f::Zero();

// 2x2 subpixel
for (int sy = 0; sy < 2; sy++) for (int sx = 0; sx < 2; sx++)
{
Vec3f r = Vec3f::Zero();

// sampling
for (int s = 0; s < samps; s++)
{
// do some computation and accumulation to r
// r = ...
}
buffer[i] = buffer[i] + r;
}
buffer[i] = buffer[i] * 0.25f;

// debug with an output section
//if (x % 16 == 0 && y % 16 == 0)
// std::cout << buffer[i] << std::endl;

}

我可以通过以下配置获得正确的结果:

  • 调试,x86 或 x64;
  • 发布,x86;
  • 发布(优化 =\Od),x64。

但是buffer是全零 vector ,Release(optimization =\O1 or\O2 or\Ox), x64,得到的是一张黑图。

因此对于 Release (optimization =\O1 or\O2 or\Ox), x64,我取消注释输出部分以检查缓冲区中的值。奇怪的是,我检查的每个像素都有正确的值,那些没有检查的仍然是零 vector 。例如,如果我像上面的代码一样每 16 个像素检查一次,我将得到这样的图片(每 16 个像素进行 256*256 黑色镶嵌):

wrong answer with Release optimization=\O1 x64

我用谷歌搜索并阅读了一些资料,例如 Surviving the Release Version ,但仍然不知道。谁能提供一些处理这些问题的经验?

更新:上面的代码不是很详细,完整代码是here ,取决于 Eigen 3.2.6。

最佳答案

看了Ideone上的代码,问题好像是这样的。在Scene 类中,intersect 方法返回一个bool const &。返回的引用是一个局部变量。如果您检查错误/警告日志,您会看到:

Warning 2 warning C4172: returning address of local variable or temporary ***.cpp 129 1

将返回类型更改为 bool 可纠正问题,输出与 32 位版本的类似。

关于c++ - 在 VS2015 中发布 x64 配置时的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37915932/

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