gpt4 book ai didi

c++ - 我怎么知道处理器是否有 xmm 寄存器或 ymm 寄存器

转载 作者:太空狗 更新时间:2023-10-29 23:17:20 25 4
gpt4 key购买 nike

伙计们,假设我有一个模板函数:

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,特别是处理器具有 XMM 寄存器以使用 1 条指令复制 4 个 float 。然后我想为 double 提供相同的功能,所以我需要 YMM 寄存器。

所以我想知道是否有一种方法可以在运行时确定 XMM 和 YMM 的可用性。

另一个更可取的选择是以某种方式知道在预处理器工作期间。 IE。这样我就可以这样写:

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

谢谢!

最佳答案

说服编译器自己对其进行矢量化要比使用内部函数或 asm 编写专门的代码要好得多。麻烦的部分是指针(或引用,如果它们被使用的话),Vector 参数指针和“this”。

不幸的是,C++ 不直接支持“限制”,但大多数编译器应该有某种特定于实现的属性来执行此操作。将 __restrict__ 与 g++ 一起使用,它也适用于函数类型以重新启动“this”:

http://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html

某些编译器(例如 llvm)可以将展开的循环矢量化为直线代码,如您的示例所示。其他人会希望重新滚动循环。通常出于自动矢量化的目的,编写循环比手动展开代码更好。

此示例是自动矢量化的一个简单案例,您将拥有更可移植的代码。

关于c++ - 我怎么知道处理器是否有 xmm 寄存器或 ymm 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18591471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com