長時間実行されるプロセスのためにデータを 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);
});
};