cyclic convolution은 각 입력의 Discrete Fourier Transform (DFT)을 취하여 변환을 곱하고 역 DFT를 취함으로써 계산할 수 있습니다. 고속 퓨리에 변환 알고리즘을 사용하면 DFT와 그 역함수는 N*log(N)
연산에서 계산할 수 있으며, 다음으로 변환을 곱하는 또 다른 연산이 가능합니다. 따라서 대충 말해서 3N*log(N)+N
작업이 필요합니다. 입력 크기가 8 인 경우 80으로 작동합니다. FFT 메서드의 연산은 MAC뿐 아니라 복소수 연산입니다.
그러나 하나의 최적화가 있습니다. 입력 데이터가 실제이기 때문에 정보를 손실하지 않고 N/2 + 1 복소수 포인트로 변환을 나타낼 수 있습니다. 이 속성을 활용하는 실수 변환 (및 역 변환)이 있습니다. 일반적으로 절반의 변환을 수행하는 것과 같습니다. 그러므로 우리가 3N*log(N)+N
에 4를 연결하면 28이됩니다. 이제는 복소수 문제를 고려해야합니다. 복잡한 곱셈은 실수와 허수 성분 각각에 대해 두 곱셈과 덧셈입니다. 그래서 각각의 복합 연산은 대략 3 개의 MAC과 동등하며, 이것은 여전히 직접 컨볼 루션보다 느리다는 것을 알 수 있습니다.
FFT 방식은 데이터 크기가 커지면서 성과가 나타납니다. 2048 길이의 입력으로 작업하는 경우 조작 수는 3 * 10240 + 1024 = 34k 조작이됩니다. 복소수 오버 헤드에 3을 곱한 경우에도 직접 구현의 ~ 4M 연산과 매우 유사합니다.
FFT 접근법을 고려해야 할 또 다른 경우는 하나의 배열을 다른 배열과 비교하거나 다른 배열을 모두에 대해 컨버팅해야하는 경우입니다. 이 경우 입력 변환을 한 번 계산하여 다시 사용할 수 있습니다. K 시퀀스의 경우 모든 K^2 교차 컨볼 루션을 수행해야하는 경우 K 변환, K^2 복소수 배열 곱하기 및 K^2 역변환을 수행 할 수 있습니다. 입력 크기가 8 인 10 개의 배열의 경우 복소수 연산이 1500 개 미만입니다 (입력, 변환 곱하기 및 출력의 경우 10*4*log(4) + 500 + 100*4*log(4)
). 직접 접근 방식을 사용하려면 100*64
MAC이 필요하므로 FFT 방식이 유리합니다.
쌍의 경우에 대해 좋은 직접 구현은 손을 아래로 승자가 될 것 같습니다.
"8 개의 부호없는 19 비트 정수"를 명확히 할 수 있습니까? 19 비트의 출력 값이 있다는 것을 의미합니까? 각각 8 비트 숫자입니까? 아니면 각각의 출력 샘플에 최대 19 개의 유효 비트가 있음을 의미합니까? 또한 백만 쌍이 있습니까? 아니면 하나의 서열을 백만개의 다른 서열과 비교하고 있습니까? 아니면 백만 시퀀스가 있습니까? 그리고 모든 교차 회선이 필요합니까? – mtrw
@mtrw 순환 회선은 8 개의 결과를 생성합니다 (크기 8 x 255²). 모든 쌍이 구별된다고 가정하십시오. –
유스 케이스의 세부 사항에 따라 많은 코어 GPU에서 계산을 수행하면 큰 속도 향상을 가져올 수 있습니다. – Gene