[Rcpp-devel] How to Get Pointer of Underlying Object of Rcpp Module Class
Tianqi Chen
tianqi.tchen at gmail.com
Wed Oct 7 03:51:19 CEST 2015
Oh, the question is not about supporting native Save/Load from R. I
understand the hardness of that due to no customized loader from external
pointer. The function listed here aims to write a customized function like
```save.list``` instead of R's native save/load, which is doable. The
question is how to get the underlying external ptr from an Rcpp
class_<MyClass> Object, within the life cycle of the R session. Sorry about
the confusion.
Let me rephrase the question in this way: I want to implement a customized
element-wise sum of a List of GPUArray object, which I exposed using Rcpp
Module class. However, in order to do that, I need to somehow get the
external Pointer of GPUArray from the S4 object, to redirect the call to
InternalSumOnGPU function.
After the computation, we need to wrap(construct) a new GPUArray S4 object
from C++ side(what was normally provided was constructor from R side).
```
class GPUArray {
public:
static SEXP Sum(SEXP list) {
Rcpp::List data_lst(list);
std::vector<GPUArray *> internals(data_lst[i]);
for (size_t i = 0; i < data_lst.size(); ++i) {
SEXP obj = data_lst[i];
// Need to Get internal pointers from S4 GPUArray object
internals[i] = GetPtr<GPUArray>(obj);
}
GPUArray *ret = InternalSumOnGPU(internals);
// need to return the S4 object
return class_<GPUArray>(ret);
}
};
RCPP_MODULE(GPUArray) {
class_<GPUArray>("GPUArray");
function("gpu.sum", &GPUArray::Sum);
}
```
Tianqi
On Tue, Oct 6, 2015 at 5:55 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
>
> On 6 October 2015 at 14:40, Tianqi Chen wrote:
> | Dear Rcpp Developers:
> |
> | ```c++
> | class MyClass {
> | public:
> | static void SaveList(SEXP list, const std::string& filename) {
> | Rcpp::List data_lst(list);
> | std::vector<MyClass *> internals(data_lst[i]);
> | for (size_t i = 0; i < data_lst.size(); ++i) {
> | SEXP obj = data_lst[i];
> | // Need to Get internal pointers from S4 MyClass object
> | internals[i] = GetPtr<MyClass>(obj);
> | }
> | SomeRealSave(internals, filename);
> | }
> | static void LoadList(const std::string& filename) {
> | std::vector<MyClass > internals;
> | SomeReadLoad(&internals);
> | Rcpp::List out(internals.size());
> | for (size_t i = 0; i < internals.size(); ++i) {
> | // need to construct a MyClass object from C++ side
> | out[i] = MyClassConstructor(internals[i]);
> | }
> | return out;
> | }
> | };
> |
> | RCPP_MODULE(MyClass) {
> | class_<MyClass>("MyClass");
> |
> | function("save.myclass.list", &MyClass::SaveList);
> | function("load.myclass.list", &MyClass::LoadList);
> | }
> | ```
> |
> | To be specific, We have ways to Save/Load the pointers to the MyClass
> object
> | (in the SomeRealSave and SomeRealLoad). In our specific use-case, It was
> an
> | Array on GPU.
>
> As I recall, we had several discussions here a few years ago about the
> impossibility of serialising Module objects to disk. In short, you
> can't. You write out a bunch of ram which you can re-read, but that doesn't
> make an object.
>
> You will have to rebuild the objects at the next run time so that memory is
> allocated and correctly pointed to.
>
> See here for one such prior email:
>
> http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2014-May/007539.html
>
> and an older one
>
> http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2011-April/002107.html
>
> | So the question is how is there any solution to GetPtr<MyClass> and
> | MyClassConstructor, so we can get the internal pointer of MyClass from
> SEXP
> | (which is the S4 object), and construct the corresponding S4 object
> given the
> | information of MyClass.
> |
> | What was wanted is indeed possible if we choose to only expose
> XPtr<MyClass>,
> | so we can simply do
> | ```
> | MyClass * GetPtr<MyClass>(SEXP obj) {
> | XPtr<MyClass>(obj).get();
> | }
> | MyClassConstructor(MyClass *ptr) {
> | return XPtr<MyClass>(ptr);
> | }
> |
> | ```
> |
> | But it would be really nice we can directly return a wrapped S4 object
> instead
> | of raw ptr
>
> Yes, it would be -- but that doesn't meam it is possible under the current
> framework.
>
> Sorry, Dirk
>
> --
> http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20151006/2b031601/attachment.html>
More information about the Rcpp-devel
mailing list