tile_static Keyword
[This documentation is for preview only, and is subject to change in later releases. Blank topics are included as placeholders.]
The tile_static keyword is used to declare a variable that can be accessed by all threads in a tile of threads. The lifetime of the variable starts when execution reaches the point of declaration and ends when the kernel function returns.
The tile_static keyword has the following limitations:
-
It can be used only on variables that are in a function that has the restrict(amp) modifier.
-
It can be used only on variables that have function or block scope.
-
It cannot be used on variables that are pointer types or types that are not copyable by blitting.
-
The value of an uninitialized tile_static variable is undefined.
The following example shows how a tile_static variable can be used to accumulate data across several threads in a tile.
// Sample data. int sampledata[] = { 2, 2, 9, 7, 1, 4, 4, 4, 8, 8, 3, 4, 1, 5, 1, 2, 5, 2, 6, 8, 3, 2, 7, 2}; // The tiles are: // 2 2 9 7 1 4 // 4 4 8 8 3 4 // // 1 5 1 2 5 2 // 6 8 3 2 7 2 // Averages. int averagedata[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; array_view<int, 2> sample(4, 6, sampledata); array_view<int, 2> average(4, 6, averagedata); parallel_for_each( // Create threads for sample.grid and divide the grid into 2 x 2 tiles. sample.extent.tile<2,2>(), [=](tiled_index<2,2> idx) restrict(amp) { // Create a 2 x 2 array to hold the values in this tile. tile_static int nums[2][2]; // Copy the values for the tile into the 2 x 2 array. nums[idx.local[1]][idx.local[0]] = sample[idx.global]; // When all the threads have executed and the 2 x 2 array is complete, find the average. idx.barrier.wait(); int sum = nums[0][0] + nums[0][1] + nums[1][0] + nums[1][1]; // Copy the average into the array_view. average[idx.global] = sum / 4; } ); for (int i = 0; i < 4; i++) { for (int j = 0; j < 6; j++) { std::cout << average(i,j) << " "; } std::cout << "\n"; } // Output. // 3 3 8 8 3 3 // 3 3 8 8 3 3 // 5 5 2 2 4 4 // 5 5 2 2 4 4