I have a multithreaded code in C, using OpenMP and Intel MKL functions. I have the following code:
omp_set_num_threads(nth);
#pragma omp parallel for private
The Intel MKL Library uses OPENMP threading software for multithreading. The number of threads created will be based on the enviornment variable "OMP_NUM_THREADS
". The default value for OMP_NUM_THREADS
depends on the Intel MKL version and OPENMP libraries.
But in your case, you are doing a nested parallelism. But by default the nested parallelism is turn off. Hence the number of threads used by mkl_ddot function will be ONE (which means no parallelism at mkl_ddot function level).
You can enable the nested parallelism by invoking omp_set_nested(1)
. By this way, in your case, the nested parallelism will be enabled and more than one thread will be used by mkl_ddot function.
That's correct - by default MKL runs with a single thread if it detects that it is being called from inside a parallel region. I have explained the way to change this behaviour in this answer. You can simply invert the boolean parameters there to make sure that MKL would only use a single thread.
Yet, if you only want MKL functions to run single-threadedly, e.g. you only use it from inside parallel regions, you'd better link with the sequential MKL driver instead. With Intel's compiler this is easy - just specify -mkl=sequential
. For other compilers you should look into the library's manual for how to link your program against the sequential driver.