void enqueueWriteBufferIntegerVector(SEXP sQueue, SEXP sMemBuffer, SEXP sGlobalWorkSize, SEXP sObject){ Rcpp::XPtr<cl_command_queue> queue(sQueue); Rcpp::XPtr<cl_mem> clMemBuffer(sMemBuffer); int globalWorkSize = Rcpp::as<int>(sGlobalWorkSize); Rcpp::NumericVector vec(sObject); int *object = new int[globalWorkSize]; for (int i=0; i<vec.size(); i++) { object[i] = vec[i]; } //Can we delete this here? cl_int ciErr1 = clEnqueueWriteBuffer(*queue, *clMemBuffer, CL_FALSE, 0, sizeof(cl_int) * globalWorkSize, object, 0, NULL, NULL); if (ciErr1 != CL_SUCCESS){ std::cout << "error writing buffer\n"; }; if (ciErr1 == CL_INVALID_COMMAND_QUEUE){std::cout << "invalid queue";}; if (ciErr1 == CL_INVALID_CONTEXT){std::cout << "invalid context";}; if (ciErr1 == CL_INVALID_MEM_OBJECT){std::cout << "invalid mem object";}; if (ciErr1 == CL_INVALID_VALUE){std::cout << "invalid value";}; if (ciErr1 == CL_INVALID_EVENT_WAIT_LIST){std::cout << "invalid event wait list";}; if (ciErr1 == CL_MISALIGNED_SUB_BUFFER_OFFSET){std::cout << "misaligned sub buffer offset";}; if (ciErr1 == CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST){std::cout << "Exec status error for events in wait list";}; if (ciErr1 == CL_MEM_OBJECT_ALLOCATION_FAILURE){std::cout << "mem object allocation fail";}; if (ciErr1 == CL_OUT_OF_RESOURCES){std::cout << "OOR";}; if (ciErr1 == CL_OUT_OF_HOST_MEMORY){std::cout << "OOHM";}; }
void enqueueWriteBufferIntegerVector(SEXP sQueue, SEXP sMemBuffer, SEXP sGlobalWorkSize, SEXP sObject){ Rcpp::XPtr<cl_command_queue> queue(sQueue); Rcpp::XPtr<cl_mem> clMemBuffer(sMemBuffer); int globalWorkSize = Rcpp::as<int>(sGlobalWorkSize); Rcpp::IntegerVector vec(sObject); int *object = new int[globalWorkSize]; for (int i=0; i<vec.size(); i++) { object[i] = vec[i]; } cl_int ciErr1 = clEnqueueWriteBuffer(*queue, *clMemBuffer, CL_FALSE, 0, sizeof(int) * globalWorkSize, object, 0, NULL, NULL); printOnError(ciErr1,"ROpenCL::enqueueWriteBufferIntegerVector()"); }
SEXP enqueueReadBufferIntegerVector(SEXP sQueue, SEXP sMemBuffer, SEXP sGlobalWorkSize, SEXP sObject){ Rcpp::XPtr<cl_command_queue> queue(sQueue); Rcpp::XPtr<cl_mem> clMemBuffer(sMemBuffer); int globalWorkSize = Rcpp::as<int>(sGlobalWorkSize); Rcpp::NumericVector vec(sObject); int *object = new int[globalWorkSize]; cl_int ciErr1 = clEnqueueReadBuffer(*queue, *clMemBuffer, CL_TRUE, 0, sizeof(cl_int) * globalWorkSize, object, 0, NULL, NULL); if (ciErr1 != CL_SUCCESS){ std::cout << "error reading buffer\n"; }; for (int i=0; i<vec.size(); i++) { vec[i] = object[i]; } return Rcpp::wrap(vec); }
SEXP enqueueReadBufferIntegerVector(SEXP sQueue, SEXP sMemBuffer, SEXP sOffset, SEXP sSize, SEXP sObject){ Rcpp::XPtr<cl_command_queue> queue(sQueue); Rcpp::XPtr<cl_mem> clMemBuffer(sMemBuffer); int offset = Rcpp::as<int>(sOffset); int size = Rcpp::as<int>(sSize); Rcpp::IntegerVector vec(sObject); int *object = new int[size]; cl_int ciErr1 = clEnqueueReadBuffer(*queue, *clMemBuffer, CL_TRUE, 0, sizeof(int) * size, object, 0, NULL, NULL); printOnError(ciErr1,"ROpenCL::enqueueReadBufferIntegerVector()"); for (int i=0; i<size; i++) { vec[i+offset] = *object++; } return Rcpp::wrap(vec); }