【问题标题】:DMD: link to libc.a? Or core.simd info?DMD:链接到 libc.a?或 core.simd 信息?
【发布时间】:2012-08-12 10:14:11
【问题描述】:

我猜不,但我想从社区来到这里,因为我对这些东西没有真正的经验。是否可以使用 DMD 与 /etc/lib/libc.a(我在 Linux x64 上)链接?

我的原因是,我正在尝试让硬件 SSE 内在函数工作(除了简单的加法/减法/等等),所以如果我能写就太好了:

// simdTest.d
import core.simd;

extern (C) float4 _mm_hadd_ps(float4 a, float4 b); // example

void main()
{
    float4 a = [1, 2, 3, 4];
    float4 b = [1, 1, 1, 1];
    float4 c = _mm_hadd_ps(a, b);
}

并编译:

dmd /usr/lib/libc.a simdTest.d

但我遇到了各种我不知道如何理解的链接错误。再说一次,我猜有什么东西阻止我这样做,但如果不是,我想知道如何去做。

或者...

我真正需要的只是让向量工作。上面的 C 函数在 core.simd 中确实存在(排序),但我无法让它工作(不确定是否有错误,或者我做错了什么)。这是我的简单代码:

import core.simd;

void main()
{
    void16 a, b;
    void16 c = __simd(XMM.HADDPS, a, b);
}

但是编译器给了我一个:

Internal error: e2ir.c 3817

编译时。有什么想法吗?

【问题讨论】:

    标签: c linker d dmd


    【解决方案1】:
    1. _mm_hadd_ps 不是一个可以链接的函数,它是一个内在函数。它只能与支持该内在函数的编译器一起使用,而 DMD 不支持。

    2. 编译器错误不是你的错。任何Internal error 都是编译器中的一个bug,应该报告给D bug 数据库。

    【讨论】:

      【解决方案2】:

      @F i L:当我使用最新的 DMD 编译器 (2.060) 尝试您的代码时,我得到一个 预期 错误:Error: void does not have a default initializer。自己查:http://www.dpaste.dzfl.pl/fb6cd879

      D 不初始化 void 值。

      如果你使用其他类型,它会起作用:

      import core.simd;
      
      void main()  {
        // void16 does not work because void16 is not initialised, testing with ubyte16
        ubyte16 a, b;
        ubyte16 c = __simd(XMM.HADDPS, a, b);
      }
      

      你可以在这里测试它-http://www.dpaste.dzfl.pl/4ea6517b

      啊,回答你的第一个问题 - 默认情况下,你的 D 应用程序已经链接到 libc,它不在 /etc/lib/libc.a 中(除非你有一个奇怪的管理员将系统库放入 /etc /lib),它通常位于 /lib 或 /usr/lib 中(尤其是在最近将 /lib 合并到 /usr/lib 之后)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 2021-01-18
        相关资源
        最近更新 更多