2016-09-12 34 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

示されている機能のいずれも副作用がない場合は、単に、あなたがNスレッドを作成して、各スレッドにアウターiループの反復回数を分けることができ、iループの反復ごとに1つのスレッドを実行することができ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); 
    } 
} 
関連する問題