The following C example computes a 2-dimensional out-of-place FFT using the cluster FFT interface:
DFTI_DESCRIPTOR_DM_HANDLE desc; MKL_LONG len[2],v,i,j,n,s; Complex *in,*out; MPI_Init(...); // Create descriptor for 2D FFT len[0]=nx; len[1]=ny; DftiCreateDescriptorDM(MPI_COMM_WORLD,&desc,DFTI_DOUBLE,DFTI_COMPLEX,2,len); // Ask necessary length of in and out arrays and allocate memory DftiGetValueDM(desc,CDFT_LOCAL_SIZE,&v); in=(Complex*)malloc(v*sizeof(Complex)); out=(Complex*)malloc(v*sizeof(Complex)); // Fill local array with initial data. Current process performs n rows, // 0 row of in corresponds to s row of virtual global array DftiGetValueDM(desc,CDFT_LOCAL_NX,&n); DftiGetValueDM(desc,CDFT_LOCAL_X_START,&s); // Virtual global array globalIN is defined by function f as // globalIN[i*ny+j]=f(i,j) for(i=0;i<n;i++) for(j=0;j<ny;j++) in[i*ny+j]=f(i+s,j); // Set that we want out-of-place transform (default is DFTI_INPLACE) DftiSetValueDM(desc,DFTI_PLACEMENT,DFTI_NOT_INPLACE); // Commit descriptor, calculate FFT, free descriptor DftiCommitDescriptorDM(desc); DftiComputeForwardDM(desc,in,out); // Virtual global array globalOUT is defined by function g as // globalOUT[i*ny+j]=g(i,j) // Now out contains result of FFT. out[i*ny+j]=g(i+s,j) DftiFreeDescriptorDM(&desc); free(in); free(out); MPI_Finalize();
The C example below illustrates one-dimensional in-place cluster FFT computations effected with a user-defined workspace:
DFTI_DESCRIPTOR_DM_HANDLE desc; MKL_LONG len,v,i,n_out,s_out; Complex *in,*work; MPI_Init(...); // Create descriptor for 1D FFT DftiCreateDescriptorDM(MPI_COMM_WORLD,&desc,DFTI_DOUBLE,DFTI_COMPLEX,1,len); // Ask necessary length of array and workspace and allocate memory DftiGetValueDM(desc,CDFT_LOCAL_SIZE,&v); in=(Complex*)malloc(v*sizeof(Complex)); work=(Complex*)malloc(v*sizeof(Complex)); // Fill local array with initial data. Local array has n elements, // 0 element of in corresponds to s element of virtual global array DftiGetValueDM(desc,CDFT_LOCAL_NX,&n); DftiGetValueDM(desc,CDFT_LOCAL_X_START,&s); // Set work array as a workspace DftiSetValueDM(desc,CDFT_WORKSPACE,work); // Virtual global array globalIN is defined by function f as globalIN[i]=f(i) for(i=0;i<n;i++) in[i]=f(i+s); // Commit descriptor, calculate FFT, free descriptor DftiCommitDescriptorDM(desc); DftiComputeForwardDM(desc,in); DftiGetValueDM(desc,CDFT_LOCAL_OUT_NX,&n_out); DftiGetValueDM(desc,CDFT_LOCAL_OUT_X_START,&s_out); // Virtual global array globalOUT is defined by function g as globalOUT[i]=g(i) // Now in contains result of FFT. Local array has n_out elements, // 0 element of in corresponds to s_out element of virtual global array. // in[i]==g(i+s_out) DftiFreeDescriptorDM(&desc); free(in); free(work); MPI_Finalize();
Copyright © 1994 - 2011, Intel Corporation. All rights reserved.