Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有效地规范化向量C++; 我想知道如何在C++中有效地规范向量。到目前为止,这就是我所拥有的。是否有办法提高效率和/或一次性完成 std::array MyClass::normalize(const std::array&arr){ std::数组输出{}; 双模=0.0; 对于(大小i=0;i_C++_Performance_Normalization - Fatal编程技术网

如何有效地规范化向量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矢量化来提高吞吐量
  • 如果向量非常宽,那么可以使用多个线程来计算大小。每个都将计算一个部分和,然后一些串行代码将收集结果
  • 如果您的值在范围内,则可以完全在浮动中工作,而不是双倍
  • 您可以通过使用内部函数(如x86上的内部函数)或使用(如果这些内部函数不可用)来计算幅值的平方反根。然后你可以按这个值缩放

  • 此外,通过融合操作和规范化,您可以获得更快的代码。假设您要添加两个向量并对结果进行规格化。您可以在一次过程中计算它们的总和和大小,然后在一秒钟内进行缩放。

    您考虑过在原地对向量进行规格化吗?创建新阵列可能会导致分配,这是非常昂贵的。如果您的目标体系结构支持SIMD指令,这也可以提高您的性能。尝试使用“-march=native”和/或使用内部函数或矢量化库进行编译。是否启动了优化器?我在这里推荐的技巧对于编译器开发人员来说是众所周知的,他们可能正在使用所有这些技巧。为什么这个问题被否决了?这是一个明确的、非平凡的、自成一体的例子。@OutOfBound我能想到的唯一原因是这个问题更适合我。堆栈溢出对于无法工作的代码问题非常有用。代码审查的目的是“我的代码可以工作,但我如何使它更好?”问题。注意我链接到了帮助页面。在这种情况下,提问者希望删除此问题,并在代码审查时再次提问;他们应该先通读询问部分,以获得尽可能好的接收效果。(这是假设除法比乘法慢。我能想到的所有硬件都是这样。)因为
    mag
    是循环不变的,GCC将在使用
    -Ofast
    @alexReking编译时自动进行更改。优化取决于编译器和选项。有些编译器有“快速数学”选项,不符合IEEE标准,但允许更快的代码。@Phil1970-是的,我知道。这就是ast的
    -ofat
    所启用的功能。我只是注意到,您在回答中给出的转换(将除法转换为乘法)既不符合IEEE标准,也可以在设置此类标志时自动执行。这是相关的,因为如果OP使用快速数学进行编译,这将不会起任何作用。