gpt4 book ai didi

rust - 内存布局、对齐和释放

转载 作者:行者123 更新时间:2023-12-03 11:35:41 25 4
gpt4 key购买 nike

最近,我想分配一个向量 u64 s 对齐到 128 字节边界,因此我可以使用 AVX512F 函数。我的第一个函数复制任意 Vec<u64>对齐 Vec<u64> :

fn copy_to_aligned(inp: Vec<u64>) -> Vec<u64> {
// note: when the returned vec is freed, the alignment / layout information
// will be lost. The internal memory will be freed using the alignment
// of a u64.
let aligned_layout = Layout::from_size_align(inp.len() * size_of::<u64>(), 128)
.unwrap();
let new_vec = unsafe {
let new_vec_mem = alloc_zeroed(aligned_layout) as *mut u64;
copy_nonoverlapping(inp.as_ptr(), new_vec_mem, inp.len());
Vec::from_raw_parts(new_vec_mem, inp.len(), inp.len())
};

return new_vec;
}

我现在意识到这段代码是错误的:虽然新向量是用对齐的内存和适当的内容创建的,但当新向量被删除时,the memory will be de-allocated with the alignment of u64 . from_raw_parts 的文档也提到了这个陷阱。

1) 为什么在释放分配时分配的对齐很重要?例如,在 C 中,我可以通过简单地调用 free 来释放任何指针。 -- 分配的对齐无关紧要。 Rust 的分配器需要知道对齐有什么特别之处?

2) 分配这个对齐向量的正确方法是什么? 我应该使用盒装切片吗?用自定义 Drop 编写我自己的结构正确对齐的实现? Other sources建议创建一个结构并指定对齐方式,然后制作一个 Vec这些结构(导致取消分配使用正确的布局)。但即使是 repr(C) ,这不能确保我所有的 u64它们很好,而且紧密地挨在一起,对吗?我想可以在结构中添加任意填充。

最佳答案

在 Rust Discord 用户 svrseri 的帮助下,我能够解决这个问题。

本质上,Rust API 的分配器假定为分配和释放提供了一个 Layout。这意味着内存分配器在释放时知道分配的请求对齐。您可以找到 API in the Rust book .

此 API 可以用于执行某些操作,例如将内存分配给不同池中的不同对齐方式。事实证明,当前 默认实现 doesn't take advantage of this information during deallocation ,但这在未来可能会改变。

目前,分配与 N 字节边界对齐的 u64 向量的最佳(唯一?)方法是创建一个结构,其中一个对齐值的 u64 作为字段,然后使用对齐提示,如此处所述:How do I allocate a Vec<u8> that is aligned to the size of the cache line?

关于rust - 内存布局、对齐和释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61255554/

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