gpt4 book ai didi

c++ - 如何正确地从水平阵列垂直读取数据?

转载 作者:行者123 更新时间:2023-12-04 17:13:17 25 4
gpt4 key购买 nike

这是我从 SDK 获得的基础设施声明:

struct alignas(32) Input {
union {
float values[16] = {};
float value;
};

// other members variables
}

std::vector<Input> myInputs;

const int numInputsA = 4;
const int numInputsB = 4;
const int numInputsC = 4;
const int numInputsD = 4;
const int numInputsE = 4;
myInputs.resize(numInputsA + numInputsB + numInputsC + numInputsD + numInputsE);

什么是使用 simd 更快加载记录的最佳方式,例如:

__m128 targetA0 = { myInputs[0].values[0], myInputs[1].values[0], myInputs[2].values[0], myInputs[3].values[0] }
__m128 targetB0 = { myInputs[4 + 0].values[0], myInputs[4 + 1].values[0], myInputs[4 + 2].values[0], myInputs[4 + 3].values[0] }
__m128 targetC0 = { myInputs[8 + 0].values[0], myInputs[8 + 1].values[0], myInputs[8 + 2].values[0], myInputs[8 + 3].values[0] }
...
__m128 targetA1 = { myInputs[0].values[1], myInputs[1].values[1], myInputs[2].values[1], myInputs[3].values[1] }
__m128 targetB1 = { myInputs[4 + 0].values[1], myInputs[4 + 1].values[1], myInputs[4 + 2].values[1], myInputs[4 + 3].values[1] }
__m128 targetC1 = { myInputs[8 + 0].values[1], myInputs[8 + 1].values[1], myInputs[8 + 2].values[1], myInputs[8 + 3].values[1] }
...
... and so on

如您所见,我继承的结构并不是真正面向以这种方式捕获数据,但无法更改它。

所以这个问题,感谢您的经验:是否可以加载数据以在每个起始索引上使用“偏移量”进行注册?或者缓存行无论如何都需要加载整个 block ,从而导致大量缓存未命中?

也许有一些技巧可以加快整个过程。至于我之前的帖子,仍然在 windows/64 位机器上,使用 FLAGS += -O3 -march=nocona -funsafe-math-optimizations(由我正在开发的生态系统强加) .

感谢您给我的任何帮助/提示/建议。

最佳答案

唯一的边际改进可能是将 alignas 更改为 64,因为您有 64 个字节,希望能使其对齐到单个缓存行中。

如今,64 字节恰好是缓存行的大小。因此,假设您需要从 RAM 中获取数据,您的 simd 设置将无关紧要。昂贵的部分将是将数据获取到 L1 缓存,其余的操作将是噪音。甚至,如果您因为对齐而需要两个缓存行,我预计增加的幅度会非常小。请记住,今天的处理器不是按顺序执行的。可能所有这些分配都在某种程度上并行运行,因此实际顺序并不那么重要。

我会建议获取一个相当简单的代码版本(两个循环)并查看生成的汇编代码。您正在使用 O3 运行,因此即使是原始代码也可能会得到相当好的(如果不是更好的话)优化。如果你真的想优化这个,你应该设置一个基准来验证你正在做的事情是否真的加快了速度。我希望简单版本会足够快(如果您获得更好的结果,请发布)。

您还应该分析整个应用程序。您可能会发现其他更容易优化并为您带来更多好处的代码。

你能变得更快吗?可能吧,但是您开始为您的代码添加显着的复杂性和限制。我可以想象这样一种情况,您的代码在您的工作站上运行速度很快,但在其他 CPU 上运行速度一般。此外,您还会使一些重要的代码复杂化。这对你来说值得吗?

关于c++ - 如何正确地从水平阵列垂直读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69092923/

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