Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.
Announcements
FPGA community forums and blogs have moved to the Altera Community. Existing Intel Community members can sign in with their current credentials.
7237 Discussions

core dumped when using DftiCreateDescriptor(desc,prec,domain,dim,sizes) with dim=2 and sizes more than {1000, 1000}

Guoyao_X_Intel
Employee
815 Views

I'm trying to perform fft on linux system(specifically cent OS 7) by Intel MKL. After writing a successfully running code sample on windows i moved it to linux and met with segmentation fault(core dumped). I carefully checked the code and found that it is the sizes parameter specified in DftiCreateDescriptor(desc,prec,domain,dim,sizes) causes this bug. Once any number in sizes is larger than 1000 with dims=2 will cause this bug. I shifted different versions of MKl but it remains.

Does anyone have any idea about this bug?

the compile arg: g++ comparison.cpp `pkg-config opencv --cflags --libs` -I/opt/intel/vtune/compilers_and_libraries_2018.3.222/linux/mkl/include/  -L/opt/intel/compilers_and_libraries_2019/linux/mkl/lib/intel64/ -lmkl_rt -g

Here is my code

#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <omp.h>

#include "mkl_dfti.h"


int main() {
	MKL_LONG len[2] = { 1080, 1920 }, status;
	float x_in[1080][1920];
	DFTI_DESCRIPTOR_HANDLE fft;
	status = DftiCreateDescriptor(&fft, DFTI_SINGLE, DFTI_REAL, 2, len);
	status = DftiSetValue(fft, DFTI_PLACEMENT, DFTI_NOT_INPLACE);
	status = DftiCommitDescriptor(fft);

	//float x[100* 100];
	float x_out[1080][1920];
	for (int i = 0; i < 10; i++) {
		double totalcputime = (double)cv::getTickCount();
		//std::cout << status << std::endl;
		status = DftiComputeForward(fft, x_in, x_out);
		//std::cout << status << std::endl;
		totalcputime = ((double)cv::getTickCount() - totalcputime) / cv::getTickFrequency();
		std::cout << "MKL-DFT Time: " << totalcputime << std::endl;
	}
	cv::Mat sizedimage = cv::Mat::zeros(1080, 1920, CV_32FC1);
	cv::Mat opencvtransform = cv::Mat(1080, 1920 / 2 + 1, CV_32FC1);
	for (int i = 0; i < 10; i++) {
		double totalcputime = (double)cv::getTickCount();
		cv::dft(sizedimage, opencvtransform);
		totalcputime = ((double)cv::getTickCount() - totalcputime) / cv::getTickFrequency();
		std::cout << "opencv-DFT Time: " << totalcputime << std::endl;
	}
	
	return 0;
}

 

0 Kudos
1 Reply
Gennady_F_Intel
Moderator
815 Views

Could you try to allocate working array dynamically, remove all opencv calls?

0 Kudos
Reply