在VS2015中释放x64配置时的结果不同

时间:2016-06-20 06:33:34

标签: c++ optimization eigen

我正在使用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;

}

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

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

但是,缓冲区是所有零向量,释放(优化= \ O1或\ O2或\ Ox),x64 ,我得到的是黑色图片。

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

wrong answer with Release optimization=\O1 x64

我用谷歌搜索并阅读了一些像Surviving the Release Version这样的材料,但仍然不知道。任何人都可以提供一些处理这些问题的经验吗?

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

1 个答案:

答案 0 :(得分:2)

在完成Ideone上的代码后,问题似乎如下。在Scene类中,intersect方法返回bool const &。返回的引用是局部变量。如果您检查了您已经看到的错误/警告日志:

  

警告2警告C4172:返回本地变量的地址或临时***。cpp 129 1

将返回类型更改为bool可以解决问题,输出类似于32位版本的输出。