皆さん、私がテンプレート関数を持っていると想像してください:
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
ありがとう!