首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AVX2或AVX512中使用PyOpenCL编写内核函数?

在AVX2或AVX512中使用PyOpenCL编写内核函数?
EN

Stack Overflow用户
提问于 2019-12-04 01:45:51
回答 1查看 128关注 0票数 0

根据我的CPU的系列类型(如果是AVX2或AVX512),我是否被限制只能使用AVX2或AVX512?

我正在使用PyOpenCL包用Python语言编写一个openCL程序,我想优化AVX2 SIMD技术。我知道AVX2是256位指令,而AVX512是512位指令,所以当我写内核函数时,我应该只使用double4变量来实现AVX2风格的指令吗?反之亦然,AVX-512风格的double8变量?

我的下一个问题是:我是否仅限于我的CPU类型支持什么?如果它支持AVX-256,我将不能在我的内核函数中运行double8变量并行化?

如果我的问题令人困惑,我很抱歉,因为我还在学习这个过程中。

谢谢

EN

回答 1

Stack Overflow用户

发布于 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实现也可能能够自动向量化您的代码,假设您已经提交了适当数量的工作项。

如果您的代码自然可以由诸如double8double4之类的向量类型表示,那么请继续使用它们。正如我前面提到的,该实现将能够在内部使用double4将使用double8的代码拆分成指令。您可能会发现这会导致更大的注册压力,因此使用比所需类型更大的类型可能会稍微适得其反。如果您只想编写代码的一个变体,那么请使用更大的向量-同样,如果代码可以自然地以这种方式表示的话。如果你必须通过扭曲来使它合适,机会是你不会获得太多。

如果关心几个百分点的性能差异,您将需要执行详细的分析,并尝试许多不同的方法。它总是在很大程度上依赖于你的特定代码,所以很难给出一般的建议。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59162689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档