我正在尝试学习使用OpenMP进行并行编程,并且我有兴趣将以下具有多个内部while
循环的do while
循环并行化:
do {
while(left < (length - 1) && data[left] <= pivot) left++;
while(right > 0 && data[right] >= pivot) right--;
/* swap elements */
if(left < right){
temp = data[left];
data[left] = data[right];
data[right] = temp;
}
} while(left < right);
我还没有弄清楚如何并行化
while
和do while
循环,也找不到任何资源来详细描述如何并行化while
和do while
循环。我已经找到了for
循环的说明,但是我无法从中推断出while
和do while
循环的情况。所以,你能描述一下我如何并行化我提供的这些循环吗?编辑: 我已将
do while
循环转换为仅使用for
循环的以下代码。for(i = 1; i<length-1; i++)
{
if(data[left] > pivot)
{
i = length;
}
else
{
left = i;
}
}
for(j=length-1; j > 0; j--)
{
if(data[right] < pivot)
{
j = 0;
}
else
{
right = j;
}
}
/* swap elements */
if(left < right)
{
temp = data[left];
data[left] = data[right];
data[right] = temp;
}
int leftCopy = left;
int rightCopy = right;
for(int leftCopy = left; leftCopy<right;leftCopy++)
{
for(int new_i = left; new_i<length-1; new_i++)
{
if(data[left] > pivot)
{
new_i = length;
}
else
{
left = new_i;
}
}
for(int new_j=right; new_j > 0; new_j--)
{
if(data[right] < pivot)
{
new_j = 0;
}
else
{
right = new_j;
}
}
leftCopy = left;
/* swap elements */
if(left < right)
{
temp = data[left];
data[left] = data[right];
data[right] = temp;
}
}
这段代码运行良好并且产生了正确的结果,但是当我尝试将上述代码的前两个for
循环并行化时,将其更改为以下内容:
#pragma omp parallel default(none) firstprivate(left) private(i,tid) shared(length, pivot, data)
{
#pragma omp for
for(i = 1; i<length-1; i++)
{
if(data[left] > pivot)
{
i = length;
}
else
{
left = i;
}
}
}
#pragma omp parallel default(none) firstprivate(right) private(j) shared(length, pivot, data)
{
#pragma omp for
for(j=length-1; j > 0; j--)
{
if(data[right] < pivot)
{
j = 0;
}
else
{
right = j;
}
}
}
速度比非并行化的代码慢。请帮我找出问题所在。
谢谢。
while(true){ if(condition){break;} do_stuff; }
的循环中,并没有通用的概念可以依靠。 - Aziuth