我正在使用的算法在比较一个数组和矩阵的一行时花费了大量时间。如果任何第 ith 个元素相同,则该算法调用过程 A,否则调用过程 B。例如:
[1, 4, 10, 3, 5]
和 [5, 3, 0, 3, 0]
调用 A()
,因为在第 4 个位置,两个数组的值都是 3。
[1, 4, 10, 3, 5]
和 [5, 3, 0, 1, 0]
调用 B()
,因为在同一位置上,值从来不相同。
请注意:(1) 数组和矩阵行始终具有相同的大小 N,以及 (2) 当至少有一个值匹配时,该算法调用 A()。
在 C 语言中实现最简单但非常 naive 的方法是:
for(int i=0; i<N; i++)
if( A[i] == B[i] ){
flag = 1;
break;
}
这种方法仍然非常低效。在最坏的情况下,我将进行 N 次比较。真正的问题在于算法要进行数万亿次这样的比较。
数组/矩阵的大小 N 变化范围在100到1000之间。我想加速这个过程。我研究了向量化,并发现我可以使用cmpeq_pd
。然而,向量化仍然会受限,因为所有条目都是longs
。有没有人有主意?也许我可以应用掩码等操作?
更多信息/背景:
- 这是一种迭代算法。 在每次迭代中,我会递增矩阵的一行并多次检查整个矩阵。 我可能还会更新几行。
- 匹配的可能性不取决于位置。
- 为了极大地加快这个过程,我愿意有误报和漏报。
- 如果有匹配,那么确认匹配的位置不相关(我只需要知道是否有匹配的位置)。
- 最大数量(约70%)的比较不会产生匹配。
- 并行化是在不同的级别上完成的,即此内核无法并行化。
A()
?你的意思是当找到匹配项时调用A()
还是B()
?你声称两者都是... - unwind