【发布时间】:2012-05-09 00:44:01
【问题描述】:
有谁知道使用 SIMD 对这样的东西进行矢量化:
for(size_t i = 0; i < refSeq.length() / 4; i++){
for(size_t j = 0; j<otherSeq.length(); j++){
if(refSeq[i] == otherSeq[j]){
if(i == 0 || j == 0)
L[i][j] = 1;
else
L[i][j] = L[i-1][j-1] + 1;
}
else
L[i][j] = 0;
}
}
【问题讨论】:
-
当您说“SIMD”时,您需要指定您正在谈论的 CPU 系列,例如x86(在这种情况下您需要指定可以假设的 SSE/AVX 级别)、PowerPC (AltiVec)、POWER (VMX/VSX)、ARM (Neon)、Cell 等。
-
另外,
refSeq[]、otherSeq[]和L[][]的数据类型是什么? -
您确实非常坚持使这个最长的子字符串算法并行:) 再次 - 数据依赖。 SIMD 适用于独立的数据块。在这里,循环中有
if(坏)和if(更糟)。您需要重新设计算法以使用屏蔽而不是分支,我不确定它是否会运行得更快。 -
它适用于 x86,所有这些都是字符串。 SSE intel 的说明。
-
@Hristo 我是,我尝试了一切,但我能找到的只是一些有趣的例子,没有更复杂的更大的例子。 :) 是的,掩蔽......虽然一个:) 谢谢:)
标签: c++ parallel-processing x86 vectorization simd