#include #include #include #include #include #include #include #include float *input; float *output; #define nFFT (98304) DFTI_DESCRIPTOR_HANDLE HandlerIdft; MKL_LONG status = 0; int main(void) { __m512i in; __m512i out; input = (float *)malloc(nFFT*2*sizeof(float)); output = (float *)malloc(nFFT*2*sizeof(float)); memset(output,0,nFFT*2); /********************print input*********************/ printf("input: "); for(int i = 0; i < nFFT*2; i++) { input[i] = i+1; //printf(" %f ",*(input+i)); } printf("\n"); /****************************************************/ float para = 1.0f / nFFT; /* Matlab IFFT scale: para = 1.0f / nFFT x86 MKL DftBackward scale: para = 1.0f / sqrt(nFFT) */ int irc = mkl_enable_instructions(MKL_ENABLE_AVX512); printf("irc-%d\n", irc); status = DftiCreateDescriptor(&HandlerIdft, DFTI_SINGLE, DFTI_COMPLEX, 1, nFFT); /* HandlerIdft: Descriptor Handler DFTI_SINGLE: Precision of the computation - DFTI_SINGLE or DFTI_DOUBLE DFTI_COMPLEX: Type of the transform - DFTI_COMPLEX or DFTI_REAL 1(DFTI_DIMENSION): Integer DFTI_LENGTHS: DFTI_LENGTHS */ status = DftiSetValue(HandlerIdft, DFTI_BACKWARD_SCALE, para); /* DFTI_FORWARD_SCALE/DFTI_BACKWARD_SCALE: Floating-point scalar Scale factor for the forward transform/backward transform */ status = DftiSetValue(HandlerIdft, DFTI_PLACEMENT, DFTI_NOT_INPLACE); /* DFTI_PLACEMENT: Named constant DFTI_INPLACE or DFTI_NOT_INPLACE Defines whether the result overwrites the input data. Default value: DFTI_INPLACE. */ //status = DftiSetValue(HandlerIdft, DFTI_THREAD_LIMIT, 1); status = DftiCommitDescriptor(HandlerIdft); /* ================================================ */ /* INTRINSICS TO BE TESTED */ /* ================================================ */ struct timespec CrcSendtime; struct timespec endtime; clock_gettime(CLOCK_REALTIME, &CrcSendtime); status = DftiComputeBackward(HandlerIdft, input, output); clock_gettime(CLOCK_REALTIME, &endtime); printf("msec [%f]\n", (float)(endtime.tv_nsec - CrcSendtime.tv_nsec)/1000000); printf("status[%d]\n ", *(int *)(&status)); /********************print output********************/ printf("output: "); for(int i = 0; i < 66; i++) { //printf(" %f ",*(output+i)); } printf("\n"); /****************************************************/ status = DftiFreeDescriptor(&HandlerIdft); return 0; }