根据我的CPU的系列类型(如果是AVX2或AVX512),我是否被限制只能使用AVX2或AVX512?
我正在使用PyOpenCL包用Python语言编写一个openCL程序,我想优化AVX2 SIMD技术。我知道AVX2是256位指令,而AVX512是512位指令,所以当我写内核函数时,我应该只使用double4变量来实现AVX2风格的指令吗?反之亦然,AVX-512风格的double8变量?
我的下一个问题是:我是否仅限于我的CPU类型支持什么?如果它支持AVX-256,我将不能在我的内核函数中运行double8变量并行化?
如果我的问题令人困惑,我很抱歉,因为我还在学习这个过程中。
谢谢
发布于 2019-12-04 04:52:36
以相反的顺序回答你的问题可能更有意义:
是否仅限于我的CPU类型支持的内容?如果它支持AVX-256,我将不能在我的内核函数中运行double8变量并行化?
不需要,所有支持double浮点类型的OpenCL实现都允许您使用double8类型编写代码。不过,最终编译成什么完全取决于实现。
如果您的CPU支持AVX-512,并且您的OpenCL实现也支持,那么它很有可能会尝试发出AVX-512指令。如果CPU或实现只支持AVX2,它可能会在内部尝试将您代码分解为分别在double8的每一半上运行。
当我写内核函数时,我应该只使用double4变量来实现AVX2风格的指令吗?反之亦然,AVX-512风格的double8变量?
对于这类问题,您的第一个参考应该始终是针对特定OpenCL实现的OpenCL优化手册。为英特尔的中央处理器运行时,this seems to be the relevant resource。
根据您的代码所做的工作,即使您的内核使用标量类型,在double数组上操作,OpenCL实现也可能能够自动向量化您的代码,假设您已经提交了适当数量的工作项。
如果您的代码自然可以由诸如double8和double4之类的向量类型表示,那么请继续使用它们。正如我前面提到的,该实现将能够在内部使用double4将使用double8的代码拆分成指令。您可能会发现这会导致更大的注册压力,因此使用比所需类型更大的类型可能会稍微适得其反。如果您只想编写代码的一个变体,那么请使用更大的向量-同样,如果代码可以自然地以这种方式表示的话。如果你必须通过扭曲来使它合适,机会是你不会获得太多。
如果关心几个百分点的性能差异,您将需要执行详细的分析,并尝试许多不同的方法。它总是在很大程度上依赖于你的特定代码,所以很难给出一般的建议。
https://stackoverflow.com/questions/59162689
复制相似问题