gpt4 book ai didi

c++ - 如何优化以下 C++ 代码片段 - 卷中的零交叉

转载 作者:行者123 更新时间:2023-11-30 05:06:38 27 4
gpt4 key购买 nike

我正在努力优化以下代码片段。正在为 320x320x320 体积中的每个体素调用该函数,其中每个体素是一个 16 位灰度值。体积存储为一系列平面(横截面),每个平面都是连续的一维数组,因此,例如,当前体素下方的体素位置变为 currentPosition + pixelsPerRow,其左侧的位置变为 currentPosition - 1。

该函数检查体积中的两个零交叉点以及当前和相邻体素的绝对值是否高于特定阈值。这是 Marr-Hildreth 边缘检测器的必要部分。

currentPosition 是当前体素,relativePosition 也可以是当前体素(在这种情况下,在同一平面上围绕它的 8 个方向检查过零)或者它可以是它正上方或正下方的体素。这样,对于每个体素,执行 27 个检查,涵盖 3D 中所有可能的方向。

也许可以重新安排函数,使其执行速度更快。我已经尝试安排检查顺序,使分支预测有更好的机会启动,但也许可以更快地进行。目前,它需要一个更大的应用程序的 50% 的处理时间,因此需要进行一些优化。

 bool zeroCrossing(int16_t* currentPosition, int16_t* relativePosition, int pixelsPerRow, int threshold)
{
return *currentPosition * *(relativePosition - pixelsPerRow - 1) < 0 && abs(*currentPosition + *(relativePosition - pixelsPerRow - 1)) > threshold
|| *currentPosition * *(relativePosition - pixelsPerRow) < 0 && abs(*currentPosition + *(relativePosition - pixelsPerRow)) > threshold
|| *currentPosition * *(relativePosition - pixelsPerRow + 1) < 0 && abs(*currentPosition + *(relativePosition - pixelsPerRow + 1)) > threshold
|| *currentPosition * *(relativePosition - 1) < 0 && abs(*currentPosition + *(relativePosition - 1)) > threshold
|| *currentPosition * *(relativePosition) < 0 && abs(*currentPosition + *(relativePosition)) > threshold
|| *currentPosition * *(relativePosition + 1) < 0 && abs(*currentPosition + *(relativePosition + 1)) > threshold
|| *currentPosition * *(relativePosition + pixelsPerRow - 1) < 0 && abs(*currentPosition + *(relativePosition + pixelsPerRow - 1)) > threshold
|| *currentPosition * *(relativePosition + pixelsPerRow) < 0 && abs(*currentPosition + *(relativePosition + pixelsPerRow)) > threshold
|| *currentPosition * *(relativePosition + pixelsPerRow + 1) < 0 && abs(*currentPosition + *(relativePosition + pixelsPerRow + 1)) > threshold;
}

最佳答案

我的直觉是这段代码很适合并行化。使用 AVX(2),或将其卸载到 GPU。这会使它超出 C++ 的范围,但对于程序的核心功能而言,这是合理的做法。

我假设您已经使用线程来并行化操作,因为这非常简单。请注意,对于 AVX,您仍然需要线程;每个 CPU 内核都有自己的 AVX 单元。

关于c++ - 如何优化以下 C++ 代码片段 - 卷中的零交叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47828950/

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