3

皆さん、私がテンプレート関数を持っていると想像してください:

template <typename T> Vector<T>* Vector<T>::overwrite(const Vector<T>* copy) {
    this->_normalized = copy->_normalized;

    this->_data[0] = copy->_data[0];
    this->_data[1] = copy->_data[1];
    this->_data[2] = copy->_data[2];
    this->_data[3] = copy->_data[3];

    return this;
}

およびその仕様:

template <> Vector<float>* Vector<float>::overwrite(const Vector<float>* copy) {
    __m128 data = _mm_load_ps(copy->_data);

    _mm_store_ps(this->_data, data);

    return this;
}

ここで、プロセッサで SSE がサポートされていることを確認したいと思います。特に、プロセッサには、1 つの命令を使用して 4 つの float をコピーするための XMM レジスタがあります。次に、 doubleに対して同じ機能を持たせたいので、YMM レジスタが必要になります。

そのため、実行時に XMM と YMM の可用性を判断する方法があるかどうかを知りたいです。

別のより好ましいオプションは、プリプロセッサのワークアウト中に何らかの方法でそれを知ることです。つまり、次のように書きます。

template <typename T> Vector<T>* Vector<T>::overwrite(const Vector<T>* copy) {
    this->_normalized = copy->_normalized;

    this->_data[0] = copy->_data[0];
    this->_data[1] = copy->_data[1];
    this->_data[2] = copy->_data[2];
    this->_data[3] = copy->_data[3];

    return this;
}

#ifdef XMM_ARE_AVAILABLE
template <> Vector<float>* Vector<float>::overwrite(const Vector<float>* copy) {
    __m128 data = _mm_load_ps(copy->_data);

    _mm_store_ps(this->_data, data);

    return this;
}
#endif

#ifdef YMM_ARE_AVAILABLE
template <> Vector<double>* Vector<double>::overwrite(const Vector<double>* copy) {
    /* code that moves four doubles */

    return this;
}
#endif

ありがとう!

4

1 に答える 1