如何有效地规范化向量C++; 我想知道如何在C++中有效地规范向量。到目前为止,这就是我所拥有的。是否有办法提高效率和/或一次性完成 std::array MyClass::normalize(const std::array&arr){ std::数组输出{}; 双模=0.0; 对于(大小i=0;i
你怎么能一次完成呢。显然,您需要使用所有项目计算如何有效地规范化向量C++; 我想知道如何在C++中有效地规范向量。到目前为止,这就是我所拥有的。是否有办法提高效率和/或一次性完成 std::array MyClass::normalize(const std::array&arr){ std::数组输出{}; 双模=0.0; 对于(大小i=0;i,c++,performance,normalization,C++,Performance,Normalization,你怎么能一次完成呢。显然,您需要使用所有项目计算mag,并且您必须在更新项目之前计算它 由于除法可能比乘法更费时,一种可能的优化方法是添加: double mag_inv = 1.0 / mag; 然后你可以把这样的项目乘以: output[i] = arr[i] * mag_inv; 如果向量已经标准化的概率相对较高,则可能需要检查mag是否等于1.0。根据问题的具体情况,有许多方法可以优化此算法的实现 对于所有循环,都可以使用SIMD矢量化来提高吞吐量 如果向量非常宽,那么可以使用多个线
mag
,并且您必须在更新项目之前计算它
由于除法可能比乘法更费时,一种可能的优化方法是添加:
double mag_inv = 1.0 / mag;
然后你可以把这样的项目乘以:
output[i] = arr[i] * mag_inv;
如果向量已经标准化的概率相对较高,则可能需要检查
mag
是否等于1.0。根据问题的具体情况,有许多方法可以优化此算法的实现
此外,通过融合操作和规范化,您可以获得更快的代码。假设您要添加两个向量并对结果进行规格化。您可以在一次过程中计算它们的总和和大小,然后在一秒钟内进行缩放。您考虑过在原地对向量进行规格化吗?创建新阵列可能会导致分配,这是非常昂贵的。如果您的目标体系结构支持SIMD指令,这也可以提高您的性能。尝试使用“-march=native”和/或使用内部函数或矢量化库进行编译。是否启动了优化器?我在这里推荐的技巧对于编译器开发人员来说是众所周知的,他们可能正在使用所有这些技巧。为什么这个问题被否决了?这是一个明确的、非平凡的、自成一体的例子。@OutOfBound我能想到的唯一原因是这个问题更适合我。堆栈溢出对于无法工作的代码问题非常有用。代码审查的目的是“我的代码可以工作,但我如何使它更好?”问题。注意我链接到了帮助页面。在这种情况下,提问者希望删除此问题,并在代码审查时再次提问;他们应该先通读询问部分,以获得尽可能好的接收效果。(这是假设除法比乘法慢。我能想到的所有硬件都是这样。)因为
mag
是循环不变的,GCC将在使用-Ofast
@alexReking编译时自动进行更改。优化取决于编译器和选项。有些编译器有“快速数学”选项,不符合IEEE标准,但允许更快的代码。@Phil1970-是的,我知道。这就是ast的-ofat
所启用的功能。我只是注意到,您在回答中给出的转换(将除法转换为乘法)既不符合IEEE标准,也可以在设置此类标志时自动执行。这是相关的,因为如果OP使用快速数学进行编译,这将不会起任何作用。