我是否被限制使用AVX2或AVX512,取决于我的CPU是什么系列类型(如果是AVX2或AVX512)
我正在使用PyOpenCL包用Python编写一个openCL程序,我想优化avx2simd技术。我知道AVX2是256位指令,AVX512位指令,所以当我编写内核函数时,我应该只使用double4变量来实现AVX2风格的指令吗?反之亦然,AVX-512样式的双8变量
我的下一个问题是:我是否仅限于我的CPU类型支持什么?如果它支持AVX-256,我将不能在我的内核函数中运行double8变量并行化吗
抱歉,如果我的问题让人困惑,因为我仍在学习过程中
谢谢
按相反顺序回答您的问题可能更有意义:
不,所有支持
double
浮点类型的OpenCL实现也允许您使用double8
类型编写代码。不过,编译的结果完全取决于实现如果您的CPU支持AVX-512,并且您的OpenCL实现也支持AVX-512,那么很有可能它会尝试发出AVX-512指令。如果CPU或实现只支持AVX2,它可能会在内部尝试将代码分解为在
double8
的每一半上分别操作对于这类问题,您的第一个参考应该始终是针对特定OpenCL实现的OpenCL优化手册。对于英特尔的CPU运行时,this seems to be the relevant resource
根据您的代码所做的,OpenCL实现可能能够自动向量化您的代码,即使您的内核使用标量类型,在
double
数组上操作,前提是您提交了适当数量的工作项如果您的代码自然地可以用向量类型(如
double8
和double4
)表示,请继续使用它们。正如我所提到的,该实现将能够在内部使用double8
将代码拆分为使用double4
的指令。您可能会发现,这会导致更大的寄存器压力,因此使用大于必要的类型可能会产生轻微的反效果。如果您只想编写代码的一个变体,请再次使用更大的向量-,如果代码可以自然地以这种方式表示。如果你必须通过扭动来保持身体健康,你很可能得不到多少好处如果您关心几个百分点的性能差异,那么您将需要执行详细的分析,并尝试多种不同的方法。这在很大程度上取决于您的特定代码,因此很难给出一般性建议
相关问题 更多 >
编程相关推荐