2016-09-12 3 views
3

Я пытаюсь создать потоки в C++. Я уверен, что создание потоков внутри цикла for не означает параллелизм. Но я хочу распараллеливать приведенный ниже фрагмент кода.Увеличение производительности в C++

for(int i = 0; i < 100000; i++) // for each instance in the dataset 
{ 
    for(int j = 0; j < 100000; j++) // target each other instance 
    { 
     if(i == j) continue; 

     float distance = 0; 

     for(int k = 0; k < 2000; k++) 
     { 
      float a = dataset->get_instance(i)->get(k)->operator float(); 
      float b = dataset->get_instance(j)->get(k)->operator float(); 
      float diff = a - b 
      distance += diff * diff; 
     } 

     distance = distance + 10; 

    } 

} 

Есть ли возможность параллелизма в вышеуказанной части кода? Или может кто-нибудь предоставить мне пример кода, чтобы понять аналогичную распараллеливание потоков.

+0

Ну, прежде всего, вам нужно выяснить, сколько у вас аппаратных ядер. Затем вам нужно измерить и разделить работу самым эффективным способом. Итак, в основном старайтесь и терпите неудачу, пока не получится. – Incomputable

+3

Этот код не работает. 'distance' объявляется внутри цикла' for (j) ', поэтому значение неизвестно вне. – kfsone

+0

@kfsone: Я обновил использование дистанции снаружи. Можете ли вы любезно предоставить какие-либо указатели или дать мне любую логику кода, чтобы быть результатом. –

ответ

4

Если ни одна из функций не показываются имеют побочные эффекты, вы можете просто запустить одну нить на итерации цикла i, вы можете создать N потоков и разделить число итераций внешнего i цикла для каждого потока, или вы можете использовать std::async:

struct ShortestDistance { 
    float distance; 
    int distClass; 
}; 

ShortestDistance inner_loop(const Dataset* dataset, int i) 
{ 
    ShortestDistance dist { MAX_FLT, 0 }; 

    for(int j = 0; j < dataset->num_instances(); j++) // target each other instance 
    { 
     if(i == j) continue; 

     float distance = 0; 

     for(int k = 0; k < dataset->num_attributes() - 1; k++) // compute the distance between the two instances 
     { 
      float a = dataset->get_instance(i)->get(k)->operator float(); 
      float b = dataset->get_instance(j)->get(k)->operator float(); 
      float diff = a - b 
      distance += diff * diff; 
     } 

     distance = sqrt(distance); 
     if (distance < dist.distance) { 
      dist.distance = distance; 
      dist.distClass = dataset->get_instance(j)->get(dataset->num_attributes() - 1)->operator int32(); 
     } 
    } 

    return dist; 
} 

void outer_loop(const Dataset* dataset) 
{ 
    std::vector<std::future<ShortestDistance>> vec; 
    for(int i = 0; i < dataset->num_instances(); i++) // for each instance in the dataset 
    {  
     vec[i] = std::async(inner_loop, dataset, i); 
    } 

    DistanceResult overallResult { FLT_MAX, 0 }; 
    for (auto&& fut : vec) 
    { 
     DistanceResult threadResult = fut.get(); 
     if (threadResult.distance < overallResult.distance) 
      overallResult = threadResult); 
    } 
} 
Смежные вопросы