1

長時間実行されるプロセスのためにデータを tile_static にコピーしようとしています。私が見たすべての例では、配列が宣言され、データはタイル内のスレッドごとに 1 つずつ埋められています。それらのスレッドはそのデータを共有します。私がやりたいことは、単一のスレッドで使用するために tile_static でいくつかのデータをコピーすることです。共有する必要はありませんが、実行時間の長いスレッドが多いため、パフォーマンスが向上すると理解しています。ただし、これが正しい方法であるかどうかはわかりません。私が行おうとしている tile_static 呼び出しは、parallel_for_each ループの下部近くにあり、次のようになります。

tile_static vector<int_2> route = av_RouteSet[t_idx.global[0]];

わかりやすくするために追加のコードを含めました。

vector<float> tiledTSPCompute(accelerator_view accl, city_set CityLocations, int NumberOfTiles,
float StartTemp, float EndTemp, float CoolingCoefficient, unsigned int MovesPerTemp){
    // Setting tile size
    static const int TS = 16;
    // Setting number of runs in terms of number of tiles
    int NumberOfRuns = NumberOfTiles * TS * TS;
    // Get results vector ready
    vector<float> Results(NumberOfRuns);
    array_view<float> av_Results(Results);
    // Get routes ready
    vector<int_2> RouteSet(sizeof(CityLocations.Cities) * NumberOfRuns);
    array_view<int_2, 2> av_RouteSet(NumberOfRuns, sizeof(CityLocations.Cities), RouteSet);
    // Prepare extent
    concurrency::extent<1> e(NumberOfRuns);
    // Create RNG
    tinymt_collection<1> mtSet(e, 500);

    concurrency::parallel_for_each(accl, av_Results.extent.tile<TS, TS>(), [=](tiled_index<TS, TS> t_idx)restrict(amp){
        auto& mt = mtSet[t_idx.global];
        //What I would like to do
        tile_static vector<int_2> route = av_RouteSet[t_idx.global[0]];

        Tiled_InitializeRoute(route);
        Tiled_RandomizeRoute(route, mt);
        Tiled_HeuristicRun(StartTemp, EndTemp, CoolingCoefficient, CityLocations, route, MovesPerTemp, mt);
        av_Results[t_idx.global] = Tiled_TotalRouteDistance(route, CityLocations);
    });
};
4

1 に答える 1