cufft 예제

cufft 예제

가장 일반적인 경우는 개발자가 기존 CUDA 루틴(예: filename.cu)을 수정하여 cuFFT 루틴을 호출하는 것입니다. 이 경우 포함 파일 cufft.h 또는 cufftXt.h는 filename.cu 파일및 링크 라인에 포함된 라이브러리에 삽입되어야 합니다. 여러 GPU에서 수행되는 단일 변환으로 단일 컴파일 및 링크 줄이 나타날 수 있습니다. 그런 다음 실행은 단계적으로 수행됩니다. 예를 들어 2GPU의 경우 2D 및 3D 변환의 경우 크기가 균일한 경우 각 GPU는 (순위 – 1) 차원에서 변환의 절반을 수행합니다. 그런 다음 최종 차원을 처리할 수 있도록 GPU 간에 데이터가 교환됩니다. 변환 일괄 처리의 경우 각 개별 변환은 단일 GPU에서 실행됩니다. 가능하면 일괄 처리가 GPU 간에 균등하게 분포됩니다. m이 n으로 나눌 수 없는 n GPU에서 수행되는 크기 m의 배치의 경우 첫 번째 m % n GPU는 m n + 1 변환을 수행합니다. 나머지 GPU는 m n 변환을 수행합니다.

예를 들어 4개의 GPU에서 수행되는 15개의 변환 일괄 처리에서 처음 3개의 GPU는 4개의 변환을 수행하고 마지막 GPU는 3개의 변환을 수행합니다. 이 방법을 사용하면 GPU 간에 데이터 교환이 필요하지 않으며 GPU 수에 따라 일괄 처리 크기가 나눌 수 있는 경우에 대해 거의 완벽한 크기 조정이 가능합니다. cuFFT 라이브러리는 이진 호환성(예: 낮은 아키텍처에 대한 코드가 있는 경우 특정 아키텍처에 대한 코드를 포함하지 않을 수 있습니다. SM37, SM52, SM61). 이는 위의 링크 명령에 반영되며 이전 r9.0 버전을 사용할 때 중요합니다. 특정 SM이 cuFFT 라이브러리에 포함되어 있는지 확인하려면 cuobjdump 유틸리티를 사용할 수 있습니다. 예를 들어 SM_50이 포함되어 있는지 알고 자하는 경우 실행할 명령은 cuobjdump -arch sm_50 libcufft_static.a입니다. 일부 커널은 일부 아키텍처에서만 빌드됩니다(예: 정밀도 산술이 절반인 커널은 SM53 이상에만 존재합니다). 이로 인해 링크 시 이러한 커널에서 아키텍처가 누락되었다는 경고가 발생할 수 있습니다. 이러한 경고는 무시해도 됩니다.

예를 들어, 아웃 오브-오브-실-복합 변환의 출력을 위한 3차원 배열의 정적 선언은 다음과 같습니다. 그런 다음 계산된 주파수 도메인 표현에서 역 변환이 수행됩니다. 이 예제에서는 두 개의 GPU를 사용하여 입력 데이터에 1차원 복합-복합 변환이 적용됩니다. 출력 데이터는 GPU 메모리에서 자연스럽게 정렬됩니다. cufftXtQueryPlan API를 사용하면 호출자가 문자열 수, 분해 계수 및 (2 크기의 힘의 경우) 유용한 마스크 및 시프트 요소를 포함하는 구조를 검색할 수 있습니다.