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 的正确替代品是啥?