gpt4 book ai didi

c - GSL gsl_vector 更好的内存管理

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:01 32 4
gpt4 key购买 nike

当我用 C++ 编写线性代数程序时,我使用 Armadillo 库。它基于模板,它为我提供了一种定义任意长度的 vector 的方法,这些 vector 不一定需要额外的内存分配,因为它们在编译时静态分配了适当的内存缓冲区。当我使用 arma::Col<double>::fixed<3>编译器会即时创建一个“新类型”,以便 vector 包含恰好 3 个 double 的缓冲区。

现在我正在使用 C 编写线性代数程序,并且我正在使用 GNU 科学库 (GSL)。为了实例化 3D vector ,我这样做:gsl_vector_alloc(3)返回 gsl_vector* .问题在于此操作会导致一小部分内存的动态分配,并且这种情况在程序运行期间会发生数百万次。我的程序浪费了大量资源来执行数千万次 malloc/free操作。

我检查了 gsl_vector 的内部结构:

typedef struct
{
size_t size;
size_t stride;
double * data;
gsl_block * block;
int owner;
} gsl_vector;

为了使库正常工作,data应指向 vector 的第一个元素,通常在 gsl_block 内结构如下:

typedef struct
{
size_t size;
double * data;
} gsl_block;

其中包含另一个 data指针。因此,为了实例化一个简单的 3D vector ,这个 malloc 的序列发生了:

  1. A gsl_vector结构是malloc 'd(在 x86_64 上约为 40 字节)。
  2. A gsl_block结构是malloc 'd(16 字节)和 block gsl_vector 的指针设置为刚刚分配的 gsl_block 的内存地址
  3. 3 个 double 组是 malloc 'd 及其内存地址都分配给了 data指针(gsl_blockgsl_vector 中的一个)。

通过删除两个 malloc,我获得了 40% 的性能提升秒。我创建了自定义 gsl_vector创建例程,分配 3 个 double 组并设置 data gsl_vector 的指针到这个数组的地址。然后我返回 gsl_vector (不是指针)。
但是这样做,我还是得到了数百万malloc(3 * sizeof(double))操作。

我没有设法将 3 个 double 的数组“嵌入”到 gsl_vector 中结构,因为如果 data指针指向结构本身内部的东西(hacky!),然后当 vector 被复制到别处时指针不再有效!

您有什么想法(除了切换到 C++ 或推出我自己的线性代数库之外)?我愿意接受任何建议。

最佳答案

在我看来,您似乎误解了 gls_block 数据结构的用途。在我看来,您应该只使用它在 gsl_block 数据结构中分配大量数据,然后将该 block 拆分为多个 gsl_vector。如果您通过分配一个数组来一次性分配所有的 gsl_vector,那么您就快完成了。您只需两次调用 malloc 并在初始化期间进行一些簿记。

这会给您带来什么,您必须事先准确地考虑您需要哪个 gsl_vector。但这是使用没有内置垃圾收集的语言时要付出的“代价”。如果您投资于此,大多数时候它具有构建代码的优势,您可能会学到很多关于如何组织计算的知识。

关于c - GSL gsl_vector 更好的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15988836/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com