FFT를 병렬로 계산하기위한 알고리즘


12

테라 바이트 크기의 신호 파일에서 FFT 계산을 병렬화하려고합니다. 현재 오픈 소스 라이브러리를 사용하는 FFT는 가장 빠른 GPU에서 CUDA를 통해 실행하는 데에도 많은 시간이 걸립니다. 이 프로세스에 적용하려는 프레임 워크는 Hadoop입니다. 기본적으로 Hadoop은 다음과 같은 방식으로 여러 서버 노드에 문제를 분배합니다.

• 입력 파일을 (키, 값) 쌍으로 분할합니다.
•이 쌍은“Map”알고리즘으로 제공되며,이 알고리즘은 맵에 넣은 내용에 따라 (키, 값) 쌍을 다른 (키, 값) 쌍으로 변환합니다.
• 그런 다음 프레임 워크는지도에서 모든 (키, 값) 출력을 수집하고 동일한 키를 사용하여 값을 단일 쌍으로 집계 할뿐만 아니라 키별로 정렬하여 (key, list (value1, value2, ..)) 쌍
•이 쌍은 "감소"알고리즘에 입력되어 최종 결과 (파일에 기록됨)로 더 많은 (키, 값) 쌍을 출력합니다.

서버 로그 처리와 같은 실제 작업에는이 모델에 대한 많은 응용 프로그램이 있지만, 특히 DSP에 익숙하지 않기 때문에 FFT를 "맵"및 "감소"작업으로 자르기 위해 프레임 워크를 적용하는 데 어려움을 겪고 있습니다.

이것이 DSP Q & A이기 때문에 프로그래밍 점보 점보를 신경 쓰지 않을 것입니다. 그러나 FFT를 병렬로 계산하기 위해 어떤 알고리즘이 존재하는지 혼란스러워합니다. 매핑 및 축소 작업은 (기술적으로) 서로 대화 할 수 없으므로 FFT는 독립적 인 문제로 분리되어 결과가 결국에는 다시 결합 될 수 있습니다.

작은 예제에서 작동하는 Cooley-Tukey Radix 2 DIT의 간단한 구현을 프로그래밍했지만 10 억 바이트의 홀수 / 짝수 인덱스 DFT를 재귀 적으로 계산하는 데는 사용할 수 없습니다. MapReduce FFT 알고리즘 (SSA 곱셈에 대한 논문의 일부로 Tsz-Wo Sze가 작성, 2 개 이상의 하이퍼 링크를 연결할 수 없음) 및 "4 단계 FFT"를 포함하여 많은 논문을 읽는 데 몇 주를 보냈습니다. ( 여기여기), 서로 비슷하고 달성하려는 것과 비슷합니다. 그러나 나는 수학적으로 절망적으로 나쁘고 {1,2, 3, 4, 5, 6, 7, 8} (모든 가상의 구성 요소가 0 인)과 같은 간단한 집합에 이러한 방법 중 하나를 직접 적용하면 다음과 같습니다. 나에게 매우 잘못된 결과. 누구든지 효율적인 병렬 FFT 알고리즘을 평범한 영어 (내가 링크 한 것 또는 다른 것)로 설명하여 프로그래밍하고 시도 할 수 있습니까?

편집 : Jim Clay와 내 설명에 혼란 스러울 수있는 사람은 테라 바이트 파일의 단일 FFT를 수행하려고합니다. 그러나 프로세스 속도를 높이기 위해 여러 서버에서 동시에 수행 할 수 있기를 원합니다.


1
정확히 무엇을 달성하려고합니까? 테라 바이트 신호 파일의 단일 FFT 또는 각 파일의 여러 개의 작은 FFT를 수행 하시겠습니까?
Jim Clay

답변:


13

귀하의 주요 문제는 알고리즘을 병렬 처리하는 방법이 아니라고 생각합니다 (실제로 수행 할 수 있음). 숫자 정밀도입니다. 큰 크기의 FFT는 수치 적으로 상당히 까다 롭습니다. FFT 계수는 이고 N이 매우 크면 계수 계산에 노이즈가 발생합니다. N=240이고 64 비트 배정도 산술을 사용한다고 가정 해봅시다. 처음 1000 개의 계수는 정확히 일치하는 (실제로 그렇게해서는 안되지만) 실제 부분을 가지므로 더 높은 정밀도의 수학이 필요하므로 사용하기가 매우 비효율적이고 번거 롭습니다.ej2πkNN=240

단일 출력 번호로 들어가는 많은 수의 작업도 매우 많기 때문에 많은 반올림 및 잘림 오류가 발생합니다. FFT의 "모든 출력은 모든 입력에 의존합니다"특성으로 인해 오류 전파가 만연합니다.

나는 그 문제를 해결하는 쉬운 방법을 모른다. 귀하의 요청은 드문 경우입니다. 대용량 데이터 세트의 스펙트럼 분석을 수행하는 대부분의 응용 프로그램은 해당 문제가없는 곳에서 실행중인 분석을 수행합니다. 아마도 당신이 당신의 응용 프로그램을 설명 할 수 있고 제약이 있지만 더 적합한 해결책을 제시 할 수 있습니다.


꽤 타당한 점 .. 나는 이것에 대해 더 생각해야 할 것이다. 어쩌면 내가 말한 것처럼 "실행중인 분석"에 의지 할 것입니다.
Philipp

나는 정말로 늦었다는 것을 알고 있지만, 우연히도 어떻게 할 수 있는지에 대한 출처를 알고 있습니까?
Claudio Brasser 2018 년

4

FFT를 다시 쓰려고 시도하는 대신 기존 FFT 구현 (예 : FFTW )을 사용하여 오버랩 또는 오버랩을 통해 신호 길이에 따라 반복적으로 적용 할 수 있습니다. 저장 방법. 이것은 FFT를 컨벌루션으로 표현함으로써 가능합니다 .

이러한 더 짧은 길이의 FFT는 서로 통신 할 필요가 없으며 전체 체계가 맵 감소 단계와 일치합니다.

일반적으로 목표 X는 신호 X가 더 작은 세그먼트로 분할되어 겹칠 수도 있습니다 (예 : X [0:10], X [5:15], X [10:20] ... ). 이 작은 세그먼트에 대해 FFT를 수행하고 마지막에 다시 결합하여 최종 세그먼트를 생성하십시오. 이것은 map-reduce 연산자와 매우 잘 어울립니다.

"map"동안 "key"는 각 세그먼트의 일부 순차적 ID (0,1,2,3,4,5, ....)이고 "value"는 신호 파일에서 세그먼트의 첫 번째 값의 INDEX (또는 파일 위치). 예를 들어, 파일에 INT32가 가득 찬 경우 두 번째 세그먼트 (위)의 색인은 5 * sizeof (INT32)입니다. (또는 다른 형식이라면 lib가있을 수 있습니다)

이제 각 작업자는 (키, 값) 파일을 받고, 올바른 지점을 찾고, M 샘플을 읽습니다 (여기서 M은 10 이상). FFT를 수행하고 파일 이름을 "예 :" RES_ [INKEY] .dat "및 (키, 값) 쌍을 반환합니다. 이 경우 "key"는 INDEX (수신 (key, value) 튜플의 "value")이고 "value"는 FFT 결과가 포함 된 파일의 이름입니다. (우리는 이것으로 돌아갈 것이다)

"축소"내에서 이제 "지도"단계에서 (키, 값)을 수락하고 해당 파일을 열고 FFT 결과를로드하고 oa 또는 os를 수행 한 다음 저장하여 겹침 추가 또는 겹침 저장을 구현할 수 있습니다. 출력 파일에 올바른 INDEX. ( (또는 this ) 의사 코드 참조 ) "map"단계는 "yt = ..."를 병렬 처리하고 "reduce"단계는 "y (i, k) = ..."부분을 처리합니다.)

네트워크의 트래픽이나 실제 데이터 파일을 포함 할 수있는 서버의로드를 줄이려면 일부 파일 저글링이 필요할 수 있습니다.


1
더 작은 크기의 청크를 결합하여 더 큰 크기의 FFT를 검색하는 겹침 추가 및 겹침 저장의 유효성에 대해 확신하지 못합니다. = AB는 크기 B의 A DFT, 트위들 팩터 적용, 크기 A의 B DFT로 나눌 수 있습니다. 더 낮은 해상도의 출력을 원한다면 작동 할 수도 있습니다.
pichenettes

안녕하세요 picenettes, 이것에 감사드립니다. 내 마음에 있었던 것은 이것이 대답에 포함 할 것입니다 ( engineeringproductivitytools.com/stuff/T0001/PT11.HTM ).
A_A

2

2N

2N/2N/22N/2

더 명확하게 말하면 전체 재귀에서 MR을 사용할 필요가 없으므로 실제로는 비효율적입니다. 문제는 수백만 메가 바이트 크기의 내부 및 외부 FFT로 분류 될 수 있으며, 이러한 메가 바이트 FFT는 FFTW 등을 사용하여 완벽하게 계산 될 수 있습니다. MR은 실제 FFT 계산이 아니라 데이터 셔플 링 및 재조합을 감독 할 책임이 있습니다.

나의 첫 번째 아이디어는 다음과 같을 것이지만, 더 똑똑한 데이터 표현으로 단일 MR 에서이 작업을 수행 할 수 있다고 생각합니다.

sR=2N/2

첫 번째 MR : 내부 FFT

맵 : 시간에 따라 소멸을 수행하고 내부 FFT를 위해 샘플을 블록 단위로 그룹화

(k,v)k0..2N1vs[k]

(k%R,(k/R,v))

감소 : 내부 FFT 계산

(k,vs)kvs(i,v)

inRin[i]=v

RinoutR

i0..R1(k,(i,out[i]))

두 번째 MR : 외부 FFT

맵 : 외부 fft에 대한 샘플을 그룹화하고 트위들 팩터 적용

(k,(i,v))k(i,v)

(i,(k,v×exp2πjik2N))

감소 : 외부 FFT 수행

(k,vs)kvs(i,v)

inRin[i]=v

RinoutR

i0..R1(i×R+k,out[i]))

개념 증명 파이썬 코드는 여기에 있습니다.

보시다시피 매퍼는 데이터 순서 만 뒤섞기 때문에 다음과 같은 가정을 따릅니다.

  • 시간의 데시 메이션 (매퍼 1)은 이전 단계에서 수행 할 수 있습니다 (예 : 데이터를 올바른 입력 형식으로 변환하는 프로그램에 의해).
  • MR 프레임 워크는 입력 키와 다른 키에 쓰는 리듀서를 지원합니다 (Google 구현에서 리듀서는 수신 한 키와 동일한 키로 만 데이터를 출력 할 수 있습니다. SSTable이 출력 형식으로 사용되기 때문이라고 생각합니다).

이 모든 것은 하나의 단일 MR, 매퍼의 내부 FFT, 감속기의 외부 FFT에서 수행 할 수 있습니다. 여기에 개념 증명이 있습니다 .


구현이 유망한 것 같고 지금 당장 통과하고 있지만 내부 FFT 감속기에서 "크기 2 ^ R의 벡터를 얻기 위해 크기 2 ^ R FFT를 수행하십시오"라고 쓰십시오. R이 2 ^ (N / 2)이면이 FFT가 2 ^ (2 ^ N / 2) 크기가 아니므로 올바르지 않습니까? 크기 R의 FFT를 의미 했습니까?
Philipp

R2Rexp2πjik2N

0

신호가 다차원 인 경우 FFT 병렬화를 매우 쉽게 수행 할 수 있습니다. MPI 프로세스에서 한 차원을 연속적으로 유지하고 FFT를 수행 한 후 다음 차원에서 작업하기 위해 전치 (전체)합니다. FFTW는 이것을합니다.

데이터가 1D이면 문제가 훨씬 더 어렵습니다. 예를 들어 FFTW는 MPI를 사용하여 1D FFT를 작성하지 않았습니다. 기수 -2 데시 메이션-인 주파수 알고리즘을 사용하는 경우, 처음 몇 단계는 순진한 DFT로 수행 될 수 있으므로 정밀도 손실없이 2 개 또는 4 개의 노드를 사용할 수 있습니다 (이것은 첫 번째 단계는 -1 또는 i이며 작동하기에 좋습니다.

또한 데이터를 변환 한 후에는 무엇을 계획하고 있습니까? 출력에 발생하는 일 (예 : 컨볼 루션, 저역 통과 필터 등)을 알고 있으면 무언가가 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.