Files
kernels/runtime/vx_api/vx_api.c

78 lines
1.7 KiB
C

#include "../config.h"
#include "../intrinsics/vx_intrinsics.h"
#include "vx_api.h"
#include <inttypes.h>
#ifdef __cplusplus
extern "C" {
#endif
func_t global_function_pointer;
void * global_argument_struct;
unsigned global_num_threads;
void spawn_warp_runonce() {
// active all threads
vx_tmc(global_num_threads);
// call user routine
global_function_pointer(global_argument_struct);
// resume single-thread execution on exit
unsigned wid = vx_warpID();
unsigned tmask = (0 == wid) ? 0x1 : 0x0;
vx_tmc(tmask);
}
void vx_spawnWarps(unsigned numWarps, unsigned numThreads, func_t func_ptr, void * args) {
global_function_pointer = func_ptr;
global_argument_struct = args;
global_num_threads = numThreads;
if (numWarps > 1) {
vx_wspawn(numWarps, (unsigned)spawn_warp_runonce);
}
spawn_warp_runonce();
}
unsigned pocl_threads;
struct context_t * pocl_ctx;
vx_pocl_workgroup_func pocl_pfn;
const void * pocl_args;
void pocl_spawn_warp_runonce() {
// active all threads
vx_tmc(pocl_threads);
int x = vx_threadID();
int y = vx_warpNum();
// call kernel routine
(pocl_pfn)(pocl_args, pocl_ctx, x, y, 0);
// resume single-thread execution on exit
int wid = vx_warpID();
unsigned tmask = (0 == wid) ? 0x1 : 0x0;
vx_tmc(tmask);
}
void pocl_spawn(struct context_t * ctx, vx_pocl_workgroup_func pfn, const void * args) {
if (ctx->num_groups[2] > 1) {
printf("ERROR: pocl_spawn doesn't support Z dimension yet!\n");
return;
}
pocl_threads = ctx->num_groups[0];
pocl_ctx = ctx;
pocl_pfn = pfn;
pocl_args = args;
if (ctx->num_groups[1] > 1) {
vx_wspawn(ctx->num_groups[1], (unsigned)&pocl_spawn_warp_runonce);
}
pocl_spawn_warp_runonce();
}
#ifdef __cplusplus
}
#endif