【发布时间】:2012-12-21 16:09:57
【问题描述】:
我正在使用 2 个无符号短裤的紧凑结构来指示开始和结束位置。
我需要能够快速确定是否有任何 Range 对象的长度(从开始到结束的差异)超过阈值。
我将拥有大量对象,每个对象都有自己的Range 数组,因此在列表或其他内容中跟踪哪些Range 对象高于阈值是不可行的。这段代码也会经常运行(每个数组每秒运行很多次),所以它需要高效。
struct Range
{
unsigned short start;
unsigned short end;
}
我将始终拥有一个大小为 2^n 的 Range 数组。虽然我想在发现超过阈值的东西后立即中止,但我很确定将它们简单地或全部放在一起并在最后检查会更快......假设我可以对循环进行矢量化。虽然如果我可以对每个向量的结果块做一个 if 语句,那就太好了。
size_t rangecount = 1 << resolution;
Range* ranges = new Range[rangecount];
...
bool result = false;
for (size_t i = 0; i < ranges; ++i)
{
result |= (range[i].end - range[i].start) > 4;
}
毫不奇怪,自动矢量化器会给出 1202 错误,因为我的数据类型不是 32 位或 64 位宽。我真的不想将我的数据大小加倍并使每个字段都成为无符号整数。所以我猜想自动矢量化方法已经过时了。
是否有可以处理 16 位变量的向量指令?如果有,我如何在 c++ 中使用它们来矢量化我的循环?
【问题讨论】:
-
您需要将范围值存储在数组中吗?为什么不将它们存储在另一个可以加快查找速度的数据结构中?
-
因此在列表或某事中跟踪哪些 Range 对象高于阈值是不可行的。如果您只想确定您是否有违反规则的范围,然后跟踪它。您不必跟踪每个对象来执行此操作。
-
您多久使用一次
end?切换到(start,size)表示而不是(start,end)是否可行。当然,您每次使用时都需要计算end,但如果end与size的相对使用率较低,那仍然可能是一场胜利...... -
我建议给
Range一个返回大小的成员函数size() const(begin() const和end() const相同)。然后,您可以轻松安全地在存储结尾的内部表示与存储大小的内部表示之间进行切换,具体取决于哪个最终被更频繁地使用。
标签: c++ performance algorithm visual-c++ vectorization