Member 14361566 Ответов: 2

Оптимизация цикла для C


Как я могу оптимизировать этот код с помощью оптимизации цикла?

Что я уже пробовал:

#include<stdio.h>
#include<omp.h>

void merge(int array[],int low,int mid,int high)
{
  int temp[30];
  int i,j,k,m; 
  j=low;
  m=mid+1;
  for(i=low; j<=mid && m<=high ; i++)
  {
     if(array[j]<=array[m])
     {
         temp[i]=array[j];
         j++;
     }
     else
     {
         temp[i]=array[m];
         m++;
     }
  }
  if(j>mid)
  {
     for(k=m; k<=high; k++)
     {
         temp[i]=array[k];
         i++;
     }
  }
  else
  {
     for(k=j; k<=mid; k++)
     {
        temp[i]=array[k];
        i++;
     }
  }
  for(k=low; k<=high; k++)
     array[k]=temp[k];
}


void mergesort(int array[],int low,int high)
{
 int mid;
 if(low<high)
 {
   mid=(low+high)/2;

   #pragma omp parallel sections num_threads(2) 
    {
      #pragma omp section
        {
          mergesort(array,low,mid);
        }
      
      #pragma omp section
        {
          mergesort(array,mid+1,high);
        }
    }
   merge(array,low,mid,high);
 }
}


int main()
{
 int array[50];
 int i,size;
 printf("Enter total no. of elements:\n");
 scanf("%d",&size);
 printf("Enter %d elements:\n",size);
 for(i=0; i<size; i++)
 {
   scanf("%d",&array[i]);
 }
 mergesort(array,0,size-1);
 printf("Sorted Elements as follows:\n");
 for(i=0; i<size; i++)
    printf("%d ",array[i]);
 printf("\n");
 return 0;
}

Patrice T

Что вы подразумеваете под "Как я могу оптимизировать этот код с помощью оптимизации цикла?" ?
Не могли бы вы уточнить ?

Member 14361566

Я хочу объединить оптимизацию цикла и OpenMP, чтобы сократить время выполнения. Но я не уверен, какой метод оптимизации цикла можно использовать. Например, loopfusion, loop interchanging, loop unrolling и т. д.

Rick York

Ваша временная переменная содержит только 30 записей. Убедитесь, что вы не пытаетесь загрузить данные в индекс больше, чем это.

2 Ответов

Рейтинг:
2

RmcbainTheThird

Сначала проверьте это.
http://wiki.c2.com/?RulesOfOptimization[^]


Рейтинг:
1

Patrice T

Цитата:
Я хочу объединить оптимизацию цикла и OpenMP, чтобы сократить время выполнения. Но я не уверен, какой метод оптимизации цикла можно использовать. Например, loopfusion, loop interchanging, loop unrolling и т. д.

Я боюсь, что в этом случае нет никакой оптимизации цикла, потому что каждый цикл находится внутри merge() и каждая операция должна выполняться последовательно, порядок операций зависит от данных, таким образом, является непредсказуемым.