Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 混合使用OpenMP和xmmintrin SSE内部函数-与非并行版本相比没有得到加速_C_Multithreading_Parallel Processing_Openmp_Sse - Fatal编程技术网

C 混合使用OpenMP和xmmintrin SSE内部函数-与非并行版本相比没有得到加速

C 混合使用OpenMP和xmmintrin SSE内部函数-与非并行版本相比没有得到加速,c,multithreading,parallel-processing,openmp,sse,C,Multithreading,Parallel Processing,Openmp,Sse,我已经用xmmintrin.hSSE指令实现了一个版本,获得了不错的加速。但现在我也在尝试在它上面实现OpenMP线程,我看到了一个相当大的减速。我在这两种情况下都得到了正确答案(即(I)仅使用SSE,或(ii)使用SSE和OpenMP) 我知道我可能做错了什么,也许比我更有经验的人能发现这个问题 我的程序的主循环有以下(简短)伪代码: int currentNode; for(int i = 0; i < numNodes; i++) { minimumDistance =

我已经用
xmmintrin.h
SSE指令实现了一个版本,获得了不错的加速。但现在我也在尝试在它上面实现OpenMP线程,我看到了一个相当大的减速。我在这两种情况下都得到了正确答案(即(I)仅使用SSE,或(ii)使用SSE和OpenMP)

我知道我可能做错了什么,也许比我更有经验的人能发现这个问题

我的程序的主循环有以下(简短)伪代码:

int currentNode; 

for(int i = 0; i < numNodes; i++) {
    minimumDistance = DBL_MAX;
    minimumDistanceNode;

    for(int j = 0; j < numNodes; j++) {
        // find distance between 'currentNode' to j-th node
        // ...
        if(jthNodeDistance < minimumDistance) {
            minimumDistance = jthNodeDistance;
            minimumDistanceNode = jthNode;
        }
    }
    currentNode = minimumDistanceNode;
}
所以我的逻辑是:

  • omp single
    用于顶级for(int i)for循环,我只需要一个专用于此的线程
  • omp parallel num_threads(omp_get_max_threads())
    用于内部for(int j)for循环,因为我希望所有内核同时处理这部分代码
  • omp critical
    在完整for(int j)循环的末尾,因为我希望线程安全地更新当前节点
就运行时间而言,OpenMP版本的速度通常是仅SSE版本的两倍

在我的代码中,是否有什么特别糟糕的东西跳出来,导致OpenMP的速度急剧下降

在我的代码中,有没有什么特别糟糕的东西跳出来 导致OpenMP速度急剧下降的原因是什么

第一:

omp single用于顶级for(int i)for循环,我只想要1 线程专用于此

您的代码中包含以下内容:

#pragma omp parallel
{
    #pragma omp single
    {
        for (int i = 1; i < totalNum; i++) 
        {
           #pragma omp parallel num_threads(omp_get_max_threads())
           {
             //....
           }

          // within the 'omp single'
          ThisPt = minimumNode;
       }
    }
}
    #pragma omp parallel for
    for (int i = 1; i < totalNum; i++) 
    {
       ...
    }
仅内部线程仍然仅由一个线程执行

第二:

内部for(int)的omp并行num_线程(omp_get_max_threads()) j) for循环,因为我希望所有核心都在 同时

问题是,这可能返回逻辑核的数量,而不是物理核的数量,并且某些代码在使用超线程时的性能可能会更差。因此,我将首先使用不同数量的线程进行测试,从2、4等开始,直到找到一个代码停止扩展的数字

正如我所希望的,在完整for(int j)循环的末尾,omp临界 线程安全地更新当前节点

最后,在完成这些更改后,您将尝试检查是否可以用以下内容替换此并行化:

#pragma omp parallel
{
    #pragma omp single
    {
        for (int i = 1; i < totalNum; i++) 
        {
           #pragma omp parallel num_threads(omp_get_max_threads())
           {
             //....
           }

          // within the 'omp single'
          ThisPt = minimumNode;
       }
    }
}
    #pragma omp parallel for
    for (int i = 1; i < totalNum; i++) 
    {
       ...
    }
#pragma omp parallel for
for(int i=1;i
在我的代码中,有没有什么特别糟糕的东西跳出来 导致OpenMP速度急剧下降的原因是什么

第一:

omp single用于顶级for(int i)for循环,我只想要1 线程专用于此

您的代码中包含以下内容:

#pragma omp parallel
{
    #pragma omp single
    {
        for (int i = 1; i < totalNum; i++) 
        {
           #pragma omp parallel num_threads(omp_get_max_threads())
           {
             //....
           }

          // within the 'omp single'
          ThisPt = minimumNode;
       }
    }
}
    #pragma omp parallel for
    for (int i = 1; i < totalNum; i++) 
    {
       ...
    }
仅内部线程仍然仅由一个线程执行

第二:

内部for(int)的omp并行num_线程(omp_get_max_threads()) j) for循环,因为我希望所有核心都在 同时

问题是,这可能返回逻辑核的数量,而不是物理核的数量,并且某些代码在使用超线程时的性能可能会更差。因此,我将首先使用不同数量的线程进行测试,从2、4等开始,直到找到一个代码停止扩展的数字

正如我所希望的,在完整for(int j)循环的末尾,omp临界 线程安全地更新当前节点

最后,在完成这些更改后,您将尝试检查是否可以用以下内容替换此并行化:

#pragma omp parallel
{
    #pragma omp single
    {
        for (int i = 1; i < totalNum; i++) 
        {
           #pragma omp parallel num_threads(omp_get_max_threads())
           {
             //....
           }

          // within the 'omp single'
          ThisPt = minimumNode;
       }
    }
}
    #pragma omp parallel for
    for (int i = 1; i < totalNum; i++) 
    {
       ...
    }
#pragma omp parallel for
for(int i=1;i
对我发布的内容有任何反馈吗?对我发布的内容有任何反馈吗?