【问题标题】:posix_memalign, malloc and calloc have problems with lli interpreterposix_memalign、malloc 和 calloc 与 lli 解释器有问题
【发布时间】: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

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

【问题讨论】:

    标签: c malloc clang llvm


    【解决方案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),但我无法有效地列出可能的非标准替代方案。检查您的系统/实现的文档以获取此类信息。
    猜你喜欢
    • 2014-11-12
    • 2011-01-13
    • 2012-03-02
    • 1970-01-01
    • 2012-01-17
    • 2021-01-06
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多