Beispiel #1
0
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()");
}
Beispiel #3
0
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);
}