gpt4 book ai didi

c++ - 类方法的向量化

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

我有一个名为 Grid 的类,其中包含一个我想要矢量化的方法,名为 countNeighbors

ma​​in 程序中,我删除并定义了 Grid 类及其所有组件,正确矢量化 countNeighbors 方法的代码:使用基本函数符号

主函数包含一个循环,在每一步调用 countNeighbors 方法,使用数组表示法 正确矢量化。

我整理如下:

icpc -std=c++11 -DNO_DEFAULT_MAPPING -O3 -finline-functions -DNDEBUG -o main main.cpp

当我编译时,循环被正确矢量化

相反,如果我将 Grid 类的代码移动到两个不同的文件中:Grid.hppGrid.cpp,当我编译时我得到:

  1. Grid.o 中,countNeighbors 函数被正确向量化

  2. 主要是循环未矢量化,报告以下诊断:

    LOOP BEGIN at main.cpp(48,52)
    remark #15382: vectorization support: call to function Grid::countNeighbors(const Grid *, size_t, int) const cannot be vectorized [ main.cpp(48,31) ]
    remark #15344: loop was not vectorized: vector dependence prevents vectorization
    LOOP END

我尝试在主循环之上添加#pragma ivdep o #pragma vector always 指令,并且我尝试添加选项-ipo ,但结果保持不变。

我该怎么做才能矢量化我的代码?

已解决:

我真的很抱歉,我刚刚意识到我在创建目标文件时没有放置 ipo 标志。现在,编译如下我得到正确的结果:

icpc -std=c++11 -DNO_DEFAULT_MAPPING -O3 -finline-functions -DNDEBUG -ipo -I . -c grid.cpp grid.hpp -o grid.o
icpc -std=c++11 -DNO_DEFAULT_MAPPING -O3 -finline-functions -DNDEBUG -ipo -I . -o main main.cpp grid.o

最佳答案

如果我正确地推断出您没有说清楚的话,那么您有一个包含对普通函数的调用的循环。当这个简单的函数定义可用时(在同一个编译单元中),它被内联,并且作为内联函数的结果,循环被向量化。但是当函数定义不在同一个编译单元中时,它就不会被向量化。

所有这些都应该是您所期望的。所以把定义放在 Grid.hpp 而不是 Grid.cpp

-ipo 可能 绕过在同一编译单元中定义的需要。但这对你来说不是那样的(我从来没有这样做过)所以依赖它似乎并不明智。

关于c++ - 类方法的向量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34838920/

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