이것은 동적 프로그래밍 문제이며 해협 정방향 구현은 너무 많은 데이터 종속성을 가지므로 SIMD 계산에 적합하지 않습니다.
그러나 알고리즘을 행별로 반복에서 대각선으로 반복하는 것으로 변경하면 전체 대각선을 병렬로 계산할 수 있습니다. 아래 이미지를 참조하십시오.
아래 '의사'코드
은 "내부"계산을 간단히하기 위해 1 개 개의 여분의 행/열을 갖는 매트릭스를 이용한다. 이 여분의 행/열은 모든 대각선 반복 전에 초기화됩니다. 당신이 계산을 위해 실제 SIMD 명령어를 원하거나/병렬 계산을 벡터화하는 방법을 알고있는 경우
int i, j, k;
for (k = 1; ; k++) {
int minI = k > refLen ? k - refLen : 1;
int maxI = k > otherLen ? otherLen : k - 1;
for (i = maxI; i >= minI;) {
j = k - i;
// vectorized calculation 256 bit (AVX2)
if (i >= 32 && otherLen - j >= 32) {
// calculate 32 values of the diagonal with SIMD
i -= 32;
continue;
}
// vectorized calculation 128 bit (SSE)
if (i >= 16 && otherLen - j >= 16) {
// calculate 16 values of the diagonal with SIMD
i -= 16;
continue;
}
// scalar calculation
if (refSeq[i - 1] == otherSeq[j - 1]) {
L[i][j] = L[i - 1][j - 1] + 1;
} else {
L[i][j] = 0;
}
i--;
}
if (k == otherLen + refLen) {
break;
}
// initialize next j-endpoint in diagonal
if (k <= refLen) {
L[0][k] = 0;
}
// initialize next i-endpoint in diagonal
if (k <= otherLen) {
L[k][0] = 0;
}
}
확실하지.
"SIMD"라고 말하면 어떤 CPU 제품군을 사용해야하는지 지정해야합니다. x86 (어떤 경우에 SSE/AVX의 레벨을 지정할 수 있습니까), PowerPC (AltiVec), POWER (VMX/VSX), ARM (네온), 셀 등을 지정해야합니다. –
또한 데이터 유형은 무엇입니까? 'refSeq []','otherSeq []'그리고'L [] []'? –
당신은 정말로이 가장 긴 부분 문자열 알고리즘을 병렬로 만드는 데에 매우 영구합니다. 다시 한번 - 데이터 의존성입니다. SIMD는 독립적 인 데이터 블록에서 작동합니다. 여기에 루프 안에'if' (나쁜)와'if'가 있습니다 (심지어 더 나쁜 경우). 분기 대신 마스킹을 사용하기 위해 알고리즘을 재 설계해야하며 빠르게 실행되는지 확실하지 않습니다. –