diff options
| author | Tobias Grosser <tobias@grosser.es> | 2016-07-13 15:54:47 +0000 |
|---|---|---|
| committer | Tobias Grosser <tobias@grosser.es> | 2016-07-13 15:54:47 +0000 |
| commit | a041239bb7d38cf95493a31cf30e320798357cbb (patch) | |
| tree | 28f348f2ea6d48a13315b7020db92a4d52a94ec9 /polly/lib/External/ppcg/gpu_array_tile.c | |
| parent | 4cff2f8d49dc65a1a7dc220c6df54f526f967441 (diff) | |
| download | bcm5719-llvm-a041239bb7d38cf95493a31cf30e320798357cbb.tar.gz bcm5719-llvm-a041239bb7d38cf95493a31cf30e320798357cbb.zip | |
Add ppcg-0.04 to lib/External
ppcg will be used to provide mapping decisions for GPU code generation.
As we do not use C as input language, we do not include pet. However, we include
pet.h from pet 82cacb71 plus a set of dummy functions to ensure ppcg links
without problems.
The version of ppcg committed is unmodified ppcg-0.04 which has been well tested
in the context of LLVM. It does not provide an official library interface yet,
which means that in upcoming commits we will add minor modifications to make
necessary functionality accessible. We will aim to upstream these modifications
after we gained enough experience with GPU generation support in Polly to
propose a stable interface.
Reviewers: Meinersbur
Subscribers: pollydev, llvm-commits
Differential Revision: http://reviews.llvm.org/D22033
llvm-svn: 275274
Diffstat (limited to 'polly/lib/External/ppcg/gpu_array_tile.c')
| -rw-r--r-- | polly/lib/External/ppcg/gpu_array_tile.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/polly/lib/External/ppcg/gpu_array_tile.c b/polly/lib/External/ppcg/gpu_array_tile.c new file mode 100644 index 00000000000..b358f2b8e4a --- /dev/null +++ b/polly/lib/External/ppcg/gpu_array_tile.c @@ -0,0 +1,71 @@ +#include <isl/aff.h> +#include <isl/map.h> + +#include "gpu_array_tile.h" + +struct gpu_array_tile *gpu_array_tile_free(struct gpu_array_tile *tile) +{ + int j; + + if (!tile) + return NULL; + + for (j = 0; j < tile->n; ++j) { + isl_val_free(tile->bound[j].size); + isl_val_free(tile->bound[j].stride); + isl_aff_free(tile->bound[j].lb); + isl_aff_free(tile->bound[j].shift); + } + free(tile->bound); + isl_multi_aff_free(tile->tiling); + free(tile); + + return NULL; +} + +/* Create a gpu_array_tile for an array of dimension "n_index". + */ +struct gpu_array_tile *gpu_array_tile_create(isl_ctx *ctx, int n_index) +{ + int i; + struct gpu_array_tile *tile; + + tile = isl_calloc_type(ctx, struct gpu_array_tile); + if (!tile) + return NULL; + + tile->ctx = ctx; + tile->bound = isl_alloc_array(ctx, struct gpu_array_bound, n_index); + if (!tile->bound) + return gpu_array_tile_free(tile); + + tile->n = n_index; + + for (i = 0; i < n_index; ++i) { + tile->bound[i].size = NULL; + tile->bound[i].lb = NULL; + tile->bound[i].stride = NULL; + tile->bound[i].shift = NULL; + } + + return tile; +} + +/* Compute the size of the tile specified by "tile" + * in number of elements and return the result. + */ +__isl_give isl_val *gpu_array_tile_size(struct gpu_array_tile *tile) +{ + int i; + isl_val *size; + + if (!tile) + return NULL; + + size = isl_val_one(tile->ctx); + + for (i = 0; i < tile->n; ++i) + size = isl_val_mul(size, isl_val_copy(tile->bound[i].size)); + + return size; +} |

