[英]How to break out an opemp for loop?
我有一個非常ᴄᴘᴜ密集(50萬次調用和超過100億次循環階段)的循環,如:
for(int i=0;i<*string;i++){
if(!check_some_stuff(string+i)) {
do_some_stuff(i,string-2);
if(!string)
break;
do_yet_other_stuff(string);
}
}
由於#pragma omp parallel for odered
不允許使用break語句#pragma omp parallel for odered
我認為我可以將i
設置為非常大的值。
for(int i=0;i<*string;i++){
if(!check_some_stuff(string+i)) {
do_some_stuff(i,string-2);
if(!string)
i=0x7FFFFFFB;
do_yet_other_stuff(string);
}
}
沒有openmp就完美無缺。 但是當我添加時
#pragma omp parallel for ordered shared(string)
for(int i=0;i<*string;i++){
if(!check_some_stuff(string+i)) {
do_some_stuff(i,string-2);
#pragma omp critical
if(!string)
i=0x7FFFFFFB; // it seems the assignment has no effect on the value of i.
do_yet_other_stuff(*string);
}
}
i
的值似乎沒有改變,所以它轉向無限循環。
這有幫助嗎?
int abort = 0;
#pragma omp parallel for ordered shared(string, abort)
for(int i=0;i<*string;i++)
{
#pragma omp flush(abort)
if(!abort)
{
if(!check_some_stuff(string+i))
{
#pragma omp flush(abort)
if(!abort) do_some_stuff(i,string-2);
if(!string) abort = 1;
#pragma omp flush(abort)
if(!abort) do_yet_other_stuff(*string);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.