首页 > 解决方案 > 在 gem5 系统调用仿真中打开由 C++ std::ifstream 处理的二进制文件失败 is_open 检查

问题描述

我有mnist.loader.hpp头文件,它打开并读取给定路径中的t10k-images-idx3-ubytet10k-labels-idx1-ubyte二进制文件,std::ifstream如下面的代码片段所示:

std::string imagePath = dataDir + std::string("t10k-images-idx3-ubyte");
std::string labelPath = dataDir + std::string("t10k-labels-idx1-ubyte");

std::ifstream imageStream(imagePath, std::ios::binary);
std::ifstream labelStream(labelPath, std::ios::binary);

具有这两个二进制文件的目录的路径dataDir嵌入在mnist_caffe.cpp中。它可以根据我std::string dataDir = "data/"在行中的设置进行更改。

我设置dataDir/home/mohamed/,然后编译并静态链接了一个 aarch64 可执行文件,我的目标是在 gem5 上模拟它。

问题

gem5 总是无法读取文件。它给"Failed to read /home/mohamed/t10k-images-idx3-ubyte".

如果我们再次查看mnist_loader.hpp,我们会注意到此错误消息是由于文件未打开或已打开但无法读取:

if (!imageStream.is_open())
    {
        std::cerr << "Failed to load " << imagePath << std::endl;
        return nullptr;
    }

或者

imageStream.read(reinterpret_cast<char*>(&magic), sizeof(magic));
    if (magic != 0x03080000)
    {
        std::cerr << "Failed to read " << imagePath << std::endl;
        return nullptr;
    }

或者

if (!imageStream.good())
{
    std::cerr << "Failed to read " << imagePath << std::endl;
    return nullptr;
}

我的猜测是gem5首先无法打开文件!

我的试验:

(我现在只对打开和阅读感兴趣t10k-images-idx3-ubyte

1-尝试使用 -i 选项将文件传递给标准输入:$ ./build/ARM/gem5.opt ./configs/example/se.py -c mnist_caffe -i '/home/mohamed/t10k-images-idx3-ubyte'

2-使用-o:$ ./build/ARM/gem5.opt ./configs/example/se.py -c mnist_caffe -o "-i /home/mohamed/t10k-images-idx3-ubyte"

3-使用--redirects:$ ./build/ARM/gem5.opt ./configs/example/se.py -c /home/mohamed/NNDeploy/ML-examples/armnn-mnist/mnist_caffe --redirects /home/mohamed/t10k-images-idx3-ubyte=/home/mohamed/t10k-images-idx3-ubyte

4-使用打开主机系统中的二进制文件,xxd然后将其传递给标准输入:$ ./build/ARM/gem5.opt ./configs/example/se.py -c ~/NNDeploy/ML-examples/armnn-mnist/mnist_caffe -o " -i /usr/bin/xxd /home/mohamed/t10k-images-idx3-ubyte"

以上所有导致相同的读取失败消息。我的想法用完了,如果有人可以提供一些建议,那就太好了!

标签: gem5

解决方案


推荐阅读