首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两次创建对齐结构数据时的C++分段错误

两次创建对齐结构数据时的C++分段错误
EN

Stack Overflow用户
提问于 2021-06-28 11:55:27
回答 1查看 81关注 0票数 0

我正在尝试编写一些对性能至关重要的c++代码。为此,我使用的是AVX本质,需要将数据对齐到32字节。

我使用一个看起来类似于此的结构:(我注释掉了其中的一些部分,以跟踪问题)

代码语言:javascript
复制
struct Summation {
    alignas(ALIGNMENT) float summation[HIDDEN_SIZE] {};

    Summation() {
//        std::memcpy(summation, inputBias, sizeof(float) * HIDDEN_SIZE);
    }

    Summation& operator=(const Summation& other) {
//        std::memcpy(summation, other.summation, sizeof(float) * HIDDEN_SIZE);
        return *this;
    }
};



struct Evaluator {

    Evaluator(){}

    // inputs and outputs
    bool inputMap[INPUT_SIZE] {};
    
    // bias
    alignas(32) float input_bias[HIDDEN_SIZE] {};
    alignas(32) float hidden_bias {};
    
    // weights
    alignas(32) float input_weights[INPUT_SIZE][HIDDEN_SIZE] {};
    alignas(32) float hidden_weights[HIDDEN_SIZE] {};

    alignas(32) float activation[HIDDEN_SIZE] {};

    std::vector<Summation> summations {};

编译此操作时不存在任何问题,运行以下操作时不会出现任何问题:

代码语言:javascript
复制
    nn::Evaluator ev1{};

当我试图创建第二个评估器时,就会出现这样的问题:

代码语言:javascript
复制
    nn::Evaluator ev1{};
    nn::Evaluator ev2{};


--> 
Process finished with exit code -1073741571 (0xC00000FD)

我把这个问题追溯到了

代码语言:javascript
复制
alignas(32) float input_weights[INPUT_SIZE][HIDDEN_SIZE] {};

然而,我不知道为什么在创建第二个评估器对象时会出现问题,但只使用一个评估器。任何帮助我都很高兴。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-28 12:00:40

我已经发现了这个问题。结果不是对齐,而是堆栈上的分配。由于2d数组与包含的其他数据相比非常大,所以它在堆栈上分配了太多的内存并导致堆栈溢出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68162937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档