Get the kernel from R path

This commit is contained in:
Paul Irofti 2025-03-29 16:43:15 +02:00
parent 17b29fb0dc
commit 9fa5f520b5
3 changed files with 21 additions and 3 deletions

View file

@ -26,6 +26,7 @@ SEXP CCubes(SEXP tt) {
// simulate the R command: // simulate the R command:
// system.file("ccubes.cl", package = "IEEE") // system.file("ccubes.cl", package = "IEEE")
const char *kernel_file = NULL;
SEXP args = PROTECT(allocVector(VECSXP, 2)); SEXP args = PROTECT(allocVector(VECSXP, 2));
SET_VECTOR_ELT(args, 0, mkString("ccubes.cl")); SET_VECTOR_ELT(args, 0, mkString("ccubes.cl"));
SET_VECTOR_ELT(args, 1, mkString("IEEE")); SET_VECTOR_ELT(args, 1, mkString("IEEE"));
@ -41,6 +42,7 @@ SEXP CCubes(SEXP tt) {
)); ));
Rprintf("Kernel file: '%s'\n", CHAR(STRING_ELT(r_result, 0))); Rprintf("Kernel file: '%s'\n", CHAR(STRING_ELT(r_result, 0)));
kernel_file = CHAR(STRING_ELT(r_result, 0));
UNPROTECT(3); UNPROTECT(3);
// 32 bits per word, in bit shifting representation // 32 bits per word, in bit shifting representation
@ -73,7 +75,7 @@ SEXP CCubes(SEXP tt) {
sprintf(log, "log-ccubes"); sprintf(log, "log-ccubes");
config_set_string("out", log); config_set_string("out", log);
struct ccubes_context *ctx = ccubes_create(); struct ccubes_context *ctx = ccubes_create(kernel_file);
if (ctx == NULL) { if (ctx == NULL) {
log_error("ccubes", "ccubes_do_tasks failed"); log_error("ccubes", "ccubes_do_tasks failed");
} }

View file

@ -27,7 +27,7 @@
struct ccubes_context * struct ccubes_context *
ccubes_create() ccubes_create(char *ccubes_kernel_file)
{ {
struct ccubes_context *ctx = NULL; struct ccubes_context *ctx = NULL;
int rc = 0; int rc = 0;
@ -56,6 +56,19 @@ ccubes_create()
goto err; goto err;
} }
if (ccubes_kernel_file == NULL) {
log_error("clccubes",
"Kernel file pointer is NULL", ccubes_kernel_file);
goto err;
}
ctx->ccubes_kernel_file = strdup(ccubes_kernel_file);
if (ctx->ccubes_kernel_file == NULL) {
log_error("clccubes",
"Failed to copy kernel file path %s",
ccubes_kernel_file);
goto err;
}
err: err:
return ctx; return ctx;
} }
@ -134,7 +147,7 @@ ccubes_build(struct ccubes_context *ctx)
rc = cl_build(*ctx->clctx, CL_DEVICE_TYPE_GPU, rc = cl_build(*ctx->clctx, CL_DEVICE_TYPE_GPU,
"ccubes.cl", &ctx->ccubes_program); ctx->ccubes_kernel_file, &ctx->ccubes_program);
if (rc != CL_SUCCESS) { if (rc != CL_SUCCESS) {
log_warn("clccubes", "Failed building ccubes.cl (%d)", rc); log_warn("clccubes", "Failed building ccubes.cl (%d)", rc);
goto err; goto err;
@ -555,6 +568,8 @@ ccubes_destroy(struct ccubes_context *ctx)
cl_clean_up(*ctx->clctx); cl_clean_up(*ctx->clctx);
log_debug("clccubes", "cl_clean_up"); log_debug("clccubes", "cl_clean_up");
free(ctx->ccubes_kernel_file);
free(ctx); free(ctx);
return; return;

View file

@ -33,6 +33,7 @@
struct ccubes_context { struct ccubes_context {
struct cl_uctx *clctx; struct cl_uctx *clctx;
char *ccubes_kernel_file;
cl_program ccubes_program; cl_program ccubes_program;
cl_kernel ccubes_task; cl_kernel ccubes_task;