On Tue, Nov 12, 2019 at 01:29:14PM +0000, Andrew Stubbs wrote:
> 2019-11-12 Andrew Stubbs <[email protected]>
>
> libgomp/
> * config/gcn/team.c (gomp_gcn_enter_kernel): Set up the team arena
> and use team_malloc variants.
> (gomp_gcn_exit_kernel): Use team_free.
> * libgomp.h (TEAM_ARENA_SIZE): Define.
> (TEAM_ARENA_FREE): Define.
> (TEAM_ARENA_END): Define.
> (team_malloc): New function.
> (team_malloc_cleared): New function.
> (team_free): New function.
> * team.c (gomp_new_team): Use team_malloc.
> (free_team): Use team_free.
> (gomp_free_thread): Use team_free.
> (gomp_pause_host): Use team_free.
> * work.c (gomp_init_work_share): Use team_malloc.
> (gomp_fini_work_share): Use team_free.
> + /* Handle OOM. */
> + if (result + size > *(void * __lds *)TEAM_ARENA_END)
> + {
> + const char msg[] = "GCN team arena exhausted\n";
> + write (2, msg, sizeof(msg)-1);
> + /* It's better to continue with reeduced performance than abort.
s/reeduced/reduced/
Not really sure if it is a good idea to print anything, at least not when
in some debugging mode. I mean, it is fairly easy to write code that will
trigger this. And, what is the reason why you can't free the
gomp_malloced memory, like comparing if the team_freed pointer is in between
TEAM_ARENA_START and TEAM_ARENA_END or similar, don't do anything in that
case, otherwise use free?
> + Beware that this won't get freed, which might cause more problems.
> */
> + result = gomp_malloc (size);
> + }
> + return result;
> +}
> +
> +static inline void * __attribute__((malloc)) __attribute__((optimize("-O3")))
> +team_malloc_cleared (size_t size)
> +{
> + char *result = team_malloc (size);
> +
> + /* Clear the allocated memory.
> + This should vectorize. The allocation has been rounded up to the next
> + 4-byte boundary, so this is safe. */
> + for (int i = 0; i<size; i+=4)
> + *(int*)(result+i) = 0;
Formatting (spaces around <, +=, +, between int and *. Shouldn't 4 be
sizeof (int)? And wouldn't memset (result, 0, size); do the same job?
Jakub