【发布时间】:2013-11-07 07:43:12
【问题描述】:
我有一个函数PI (input 0 or 1),它给出了PI[0] = -1, PI[1] = 1。
给定一个字节 B,我想要一个函数计算从左到右超过 PI 的最小超量。同样,我需要一个函数来计算从左到右超过 PI 的最大超出量。示例:
PI_MIN[0] = -8, PI_MAX[0] = -1
PI_MIN[1] = -7, PI_MAX[1] = -1
PI_MIN[2] = -6, PI_MAX[2] = -1
PI_MIN[3] = -6, PI_MAX[3] = -1
目前我预先计算函数值,将它们存储在通用表中,并在运行时访问它。或者,我天真地计算结果(for loop over bits)。对于PI_MIN 和PI_MAX,我们有:
static constexpr int8_t PI_MIN[] { -8, -7, -6, -6, -6, -5, -5, -5, -6, -5, -4, -4, -4, -4, -4,
-4, -6, -5, -4, -4, -4, -3, -3, -3, -4, -3, -3, -3, -3, -3, -3, -3, -6, -5, -4, -4, -4, -3, -3, -3, -4, -3, -2, -2,
-2, -2, -2, -2, -4, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -6, -5, -4, -4, -4, -3, -3, -3, -4,
-3, -2, -2, -2, -2, -2, -2, -4, -3, -2, -2, -2, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -4, -3, -2, -2, -2, -1,
-1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -6, -5, -4,
-4, -4, -3, -3, -3, -4, -3, -2, -2, -2, -2, -2, -2, -4, -3, -2, -2, -2, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1,
-4, -3, -2, -2, -2, -1, -1, -1, -2, -1, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -3,
-2, -2, -2, -1, -1, -1, -2, -1, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, -2, -1, 0, 0, 0,
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
static constexpr int8_t PI_MAX[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 0, 0, 0, 1, 2, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 0, 0, 0, 1,
2, 0, 0, 0, 0, 0, 0, 1, 2, 1, 1, 1, 2, 2, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0,
1, 2, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 4, 4,
4, 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 1,
1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 4, 4, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 4, 4, 4, 5, 6, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 4, 4, 4, 5, 6, 4, 4,
4, 4, 4, 4, 5, 6, 5, 5, 5, 6, 6, 6, 7, 8 };
不幸的是,我找不到我需要使用的所有功能的模式(例如PI_MIN, PI_MAX,但还有更多)。问题是:如何找出是否存在可以以非天真的方式计算它的函数(即,输入字节中没有从左到右的 for 循环)。我的目标是达到最大性能,因为这个函数在一个更大的程序的最内层循环中。
感谢任何提示!
【问题讨论】:
-
最大性能将是您的表查找,不是吗?而且你对 PI_MIN 和 PI_MAX 的定义我一点都不清楚。
-
缓存未命中时,表查找很糟糕,我需要一个函数来避免内存访问。 PI_MAX 是 PI 的最大和,你可以得到一个字节,PI_MIN 是最小和。将输入视为字节,即 00000000、00000001、00000010、00000011 等
-
“最小超出 PI”是什么意思?
-
给定一个字节 B,其位为 b0、b1、..、b7,其中 b0 是最高有效位,计算总和 PI[b0],然后计算 PI[b0]+PI[b1] ,然后是 PI[b0]+PI[b1]+PI[b2],等等,直到你有 PI[b0]+..+PI[b7]。你得到的最大值是 PI_MAX[B],你得到的最小值是 PI_MIN[B]。例如。对于 B = 0,PI_MIN[0] = -8,因为 PI[b0] + PI[b1] + .. + PI[b7] 小于您可能在 B 上计算的所有其他总和
-
@user46317,这非常清楚。谢谢。那样的话,你不是只计算字节中的 0 和 1 吗?
标签: c++ function binary pattern-matching