2016-03-08 104 views
0

的代码是这样的:如何在MKL中调用cblas_sgemm时避免fork-join?

for(int i = 0; i < loop_count; i++) 
    cblas_sgemm(<paras group A>); 

当矩阵不是非常大,的fork-join成本是非常明显的,尤其是当这是在MIC运行。此外,手动分离任务将导致MIC上出现一些问题,如MKL Performance on Intel Phi所示。

//separate the left and result matrix by hand. 
    //not a wise solution on MIC 
    #pragma omp parallel 
    for(int i = 0; i < loop_count; i++) 
    cblas_sgemm(<paras group B>); 

如果有,我可以使用代码的技术:

#pragma omp parallel 
    for(int i = 0; i < loop_count; i++) 
    cblas_sgemm(<paras group A>); 

其中cblas_sgemm使用线程分叉出来的for循环,因为MKL还使用OpenMP的创建线程。

此致FatRabb1t。

+0

MKL并行调用在内部具有'#pragma omp parallel'。所以你的第一个代码段将会并行运行。你的其他呼叫没有任何意义,因为你不再在线程中分散工作。也许你的意思是'#pragma omp parallel for'? – NoseKnowsAll

+0

我很抱歉问这样一个令人困惑的问题。 我想减少fork-join操作的次数。但似乎不可能。谢谢,NoseKnowsAll。 –

回答

0

您可以通过链接顺序版本的MKL来做到这一点,以便cblas_sgemm不会分叉多个线程来计算矩阵。

另一方面,你可以使用OpenMP parallel for加快你的代码。

#pragma omp parallel for 
for(int i = 0; i < loop_count; i++) 
    cblas_sgemm(<paras group B>); 

通过这种方式,你的fork-join线程只有一次,而不是loop_count倍。

如果您使用的是英特尔编译器icc/icpc,则可以将顺序MKL与编译器选项-mkl=sequential而不是-mkl关联。

如果您正在使用其他编译器,如gcc,则可以使用MKL链接线路顾问来帮助您生成所需的链接行选项。 https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor

相关问题