Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在R中使用自定义内存分配函数_C_R_Memory Management - Fatal编程技术网

C 在R中使用自定义内存分配函数

C 在R中使用自定义内存分配函数,c,r,memory-management,C,R,Memory Management,我希望能够对R中的某些数据结构(实值向量和数组)使用我自己的内存分配函数。原因是我需要数据64位对齐,并且我希望使用控制哪个内存节点被使用(我正在使用四个12核AMD Opteron 6174 CPU的计算节点) 现在我有两个分配和释放内存的函数:numa\u alloc\u onnode和numa\u free(由提供)。我使用的是R版本3.1.1,因此我可以访问函数allocVector3(src/main/memory.c),在我看来,这是添加自定义内存分配器的预期方式。我还在src/in

我希望能够对R中的某些数据结构(实值向量和数组)使用我自己的内存分配函数。原因是我需要数据64位对齐,并且我希望使用控制哪个内存节点被使用(我正在使用四个12核AMD Opteron 6174 CPU的计算节点)

现在我有两个分配和释放内存的函数:
numa\u alloc\u onnode
numa\u free
(由提供)。我使用的是R版本3.1.1,因此我可以访问函数
allocVector3
src/main/memory.c
),在我看来,这是添加自定义内存分配器的预期方式。我还在
src/include/R\u ext

然而,我不清楚如何将这些片段组合在一起。比方说,在R中,我想要一个计算的结果
res
,比如


resR在
memory.c中有:

main/memory.c
84:#include <R_ext/Rallocators.h> /* for R_allocator_t structure */
main/memory.c
84:#包含/*用于R#U分配器结构*/

因此,我认为您还需要包含该头以获取自定义分配器(
RInternals.h
仅声明它,而不定义
结构
或包含该头)

我在解决问题方面取得了一些进展,我想与大家分享一下,以防其他人遇到类似情况。感谢凯文的评论。我错过了他提到的include声明。不幸的是,这只是众多问题中的一个

动态加载(“myAlloc.so”) 大小=大小; 返回(void*)numa\u alloc\u local(大小); } void my_free(R_分配器_t*分配器,void*addr){ 大小\u t大小=((分配器\u数据*)分配器->数据)->大小; 无单位(地址、大小); } SEXP myAllocC(sexpa){ 分配器数据*我的分配器数据=malloc(sizeof(分配器数据)); 我的\u分配器\u数据->大小=0; R_allocator_t*my_allocator=malloc(sizeof(R_allocator_t)); my_分配器->mem_alloc=&my_alloc; my_分配器->mem_free=&my_free; my_分配器->res=NULL; 我的分配程序->数据=我的分配程序数据; R_xlen_t n=asReal(a); SEXP result=PROTECT(allocVector3(REALSXP,n,my_分配器)); 解除保护(1); 返回结果; }
为了编译c代码,我使用了
R CMD SHLIB-std=c99-L/usr/lib64-lnuma myAlloc.c
。据我所知,这很好用。如果任何人有改进/修正,我很乐意将其包括在内


原始问题中的一个尚未解决的要求是对齐问题。由
numa\u alloc\u local
返回的内存块已正确对齐,但新
VECTOR\u SEXPREC
的其他字段(例如
sxpinfo\u struct
头)会向后推送数据数组的开始。有没有可能将这个起点(REAL()返回的地址)对齐?

这是一个猜测:“我试图避免使用Rcpp,因为我正在修改一个相当大的包,不想转换所有C调用,并且认为混合使用不同的C接口可能会执行次优。”请以经验证明Rcpp会使代码变慢。对不起,我不想冒犯任何人,也不想暗示在这种情况下使用Rcpp是一个坏主意。如果有人知道如何使用Rcpp解决我的问题,我很乐意尝试一下。也许最好将最后一节表述为:“我没有看Rcpp,因为我正在修改一个不使用Rcpp的相当大的包。”更改是增量的。您可以只添加一个(新)函数,而不需要对包的其余部分进行任何更改。我尝试用Rcpp解决我的问题,但得到了一个尚不支持的
长向量
错误。我使用的是
Rcpp\u 0.11.3
。我是做错了什么,还是长向量实际上还不受支持?