SIMD.jlの存在を知っています。 ただし、SIMDベクトルの基本的なコード生成は、Juliaベース自体でより簡単な方法でサポートされ、基になるタイプだけでなく、ラッピングタプルの詳細の一部を非表示にする必要があると思います。
したがって、私の提案は、現在のNTuple{N, VecElement{T}}
と本質的に同等であるタイプVecTuple{N,T}
を定義することです。 違いは、 VecElement
codegenプロパティが必要に応じて暗黙的に適用されますが、要素ではなくタプルに関連付けられることです。 このように、タプルの個々の要素にアクセスするために、追加の変換T <-> VecElement{T}
を実行する必要はありません。 現在、 NTuple{N, VecElement{T}}
単一の要素にアクセスするには、単にx[i]
ではなく、 x[i].value
が必要です。
また、タイプの合計サイズと配置の要件、またはどの基本タイプ(ビットサイズ8〜64)が許可されるかは、特殊なタプルに関連付けられます。 #20961も参照してください。
SIMDベクトルで可能なすべての操作をJuliaベースに追加することを提案しているわけではありません。 確かに多すぎます(シャッフル、転置、または反転について考えてください)。 これは当面はすべて特殊なパッケージに任せることができ、最も基本的なLLVMcodegenプロパティがタプルにリンクされる方法の種類を変更するだけです。
(もちろん、 VecTuple
は、この問題に関する便利な名前の単なるプレースホルダーです。)
他の人へのリマインダーとして、タプルは抽象的なベクトルのタイプとして定義されていないため、VecTupleはありません。したがって、ベクトル化されたタプルについて話すことは、用語の部分的な衝突です。
続行する方法の1つのアイデアは、ベースに入れるべきだと思うことを説明する新しいパッケージを作成することです。 たとえばSIMDBase
呼びます。 次に、 SIMD
をそのパッケージにリターゲットできます。これにより、仮定が正しければ、 SIMD
簡略化されます。 SIMDBase
提供する機能について人々が同意すると、Baseに移動できます。
たとえば、低レベルのLLVM呼び出しのゆがみの一部を他の場所で処理できるかどうかは気になりません。
参考までに、SIMD組み込み型についてもここで詳しく説明します:#2299
実現可能なコンセプトを考え出そうと思います...少し時間がかかるかもしれません。
最も参考になるコメント
続行する方法の1つのアイデアは、ベースに入れるべきだと思うことを説明する新しいパッケージを作成することです。 たとえば
SIMDBase
呼びます。 次に、SIMD
をそのパッケージにリターゲットできます。これにより、仮定が正しければ、SIMD
簡略化されます。SIMDBase
提供する機能について人々が同意すると、Baseに移動できます。たとえば、低レベルのLLVM呼び出しのゆがみの一部を他の場所で処理できるかどうかは気になりません。