posix_memalign、malloc 和 calloc 与 lli 解释器有问题

Posted

技术标签:

【中文标题】posix_memalign、malloc 和 calloc 与 lli 解释器有问题【英文标题】:posix_memalign, malloc and calloc have problems with lli interpreter 【发布时间】:2017-07-31 00:11:18 【问题描述】:

我使用 polybench 内核。在polybench.c中,代码有如下一行:

  int ret = posix_memalign (&new, 32, num);

这一行使 lli 解释器出现问题。我尝试改用 malloc,但我有同样的错误

LLVM ERROR: Tried to execute an unknown external function: posix_memalign

有没有其他功能可以使用而不会出现这个问题?

【问题讨论】:

【参考方案1】:

听到posix_memalign() 被标准化为 POSIX 的一部分,而不是标准 C 的一部分,您不会感到惊讶。因此,提供该功能不是符合 C 实现的要求。另一方面,作为 POSIX 的一部分,它被广泛使用。

malloc() 承诺为任何类型的对象返回一个指向正确对齐的内存的指针。我不确定您为什么要确保更严格的对齐要求,但您这样做的下一个最佳选择是 aligned_alloc() 函数,这是自 C2011 以来的标准 C。如果您的 C 库符合 C2011,那么您可以将 posix_memalign() 调用替换为

#include <stdlib.h>
#include <errno.h>

// ...

new = aligned_alloc(32, num);
int ret = (new ? 0 : errno);

如果您也没有aligned_alloc(),那么您的实现可能会提供其他替代方案,但它们都不是标准的。

【讨论】:

我使用了aligned_alloc,问题是LLVM编译器不接受它们。 这似乎不是编译器问题,@R.Omar。相反,它看起来像是系统的 C 库提供了哪些函数的问题。您不能调用实际上不可用的函数。您可以在这里找到有用的信息:How can I use C++ 11 features in Clang?(尽管它是关于 C++,而不是 C),但我无法有效地列出可能的非标准替代方案。检查您的系统/实现的文档以获取此类信息。

以上是关于posix_memalign、malloc 和 calloc 与 lli 解释器有问题的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中 posix_memalign 的正确替代品是啥?

posix_memalign 有对应的 c++ 吗?

C++11 中的动态对齐内存分配

sigsegv 发生在 posix_memalign 在某些设备中释放后立即发生并在 AIX 中编译选项

realloc 失败的可能性有多大?

ARM GCC 中对 posix_memalign 的未定义引用