3

いいえと思いますが、私はこのような経験があまりないので、コミュニティから参加したいと思います。/etc/lib/libc.a (私は Linux x64 を使用しています) と DMD をリンクすることはできますか?

私の理由は、ハードウェア 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. コンパイラ エラーはあなたのせいではありません。いずれInternal 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 に答える