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;
}
所以我的逻辑是:
用于顶级for(int i)for循环,我只需要一个专用于此的线程omp single
用于内部for(int j)for循环,因为我希望所有内核同时处理这部分代码omp parallel num_threads(omp_get_max_threads())
在完整for(int j)循环的末尾,因为我希望线程安全地更新当前节点omp critical
#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
对我发布的内容有任何反馈吗?对我发布的内容有任何反馈吗?