3

我猜不,但我想从社区来到这里,因为我对这些东西没有真正的经验。是否可以使用 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

编译时。有任何想法吗?

4

2 回答 2

2
  1. _mm_hadd_ps不是您可以链接的功能,它是内在的。它只能与支持该内在函数的编译器一起使用,而 DMD 不支持。

  2. 编译器错误不是你的错。AnyInternal error是编译器中的错误,应报告给 D 错误数据库。

于 2012-08-12T12:21:43.833 回答
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 之后)。

于 2012-08-13T08:21:51.590 回答