我们正在尝试并行运行两个cblas_dgemm实例。如果线程总数是16,我们希望每个实例使用8个线程运行。目前,我们使用的结构如下:
#pragma omp parallel num_threads(2)
{
if (omp_get_thread_num() == 0){
cblas_dgemm(...);
}else {
cblas_dgemm(...);
}
}以下是问题所在:
在顶层,有两个OpenMP线程,每个线程在一个if/else块中都是活动的。现在,我们期望这些线程调用cblas_dgemm函数是并行的,并且在这些cblas_dgemm函数中,我们期望产生新的线程。
为了设置每个cblas_dgemm内部的线程数,我们设置了相应的环境变量: setenv OPENBLAS_NUM_THREADS 8但是,它似乎不工作。如果我们测量每个并行调用的运行时,运行时值是相等的,但当不使用嵌套并行性并且环境变量OPENBLAS_NUM_THREADS设置为1时,它们等于单个cblas_dgemm调用的运行时。
哪里出了问题?我们怎样才能得到想要的行为呢?我们有没有办法知道cblas_dgemm函数中的线程数?
非常感谢您的时间和帮助
发布于 2019-03-11 15:23:49
您尝试使用的机制称为“嵌套”,即在外部现有并行区域中创建新的并行区域已处于活动状态。虽然大多数实现都支持嵌套,但默认情况下它是禁用的。尝试在命令行中设置OMP_NESTED=true,或者在代码中的第一个OpenMP指令之前调用omp_set_nested(true)。
我还会将上面的代码改为如下所示:
#pragma omp parallel num_threads(2)
{
#pragma omp sections
#pragma omp section
{
cblas_dgemm(...);
}
#pragma omp section
{
cblas_dgemm(...);
}
}这样,代码也将只使用一个线程来计算正确的内容,序列化对dgemm的两个调用。在只有一个线程的示例中,代码将会运行,但会错过第二个dgemm调用。
https://stackoverflow.com/questions/55080295
复制相似问题