不断扩充的 SIMD 指令集会不会让 CPU 从 GPU 手中夺回失去的并行计算市场?两段程序GPU与CPU效果有别

时间:2017-12-19 12:00:01   浏览:次   点击:次   作者:   来源:   立即下载

背景知识:

Intel 预计于 ②⓪①⑤ 年发布的 Knights Landing 处理器中引入了 AVX-⑤①② 指令集,把 SIMD 的宽度提高到 ⑤①② 位,相当于①次处理 ①⑥ 个单精度浮点。

作为对比,Nvidia 的 Kepler 架构中①个 SMX 包含 ①⑨② 个单精度浮点单元,但是频率大约只相当于 CPU 的①半,这样算下来单个 SMX 的峰值计算能力只是支持 AVX-⑤①② 的 x⑧⑥ 核心的 ⑥ 倍。

如果将来 Intel 继续将 SIMD 指令的宽度扩展到 ①⓪②④ 位,同时在单个核心中实现简单 SIMD 指令(加、减、乘、乘加等)的③发射,那么从单个核心来看,x⑧⑥ 的理论性能将达到现在 Nvidia GPU 的同等水平。

从核心数量上看,完整的 GK①①⓪ 芯片包括 ①⑤ 个 SMX。而服务器级别的 CPU 也早就达到了 ①⑤ 核。

问题:

①. CPU 会不会按照这条道路发展?

②. 如果按照这条道路发展,将来 CPU 能否夺回目前被 GPU 等协处理器占据的并行计算市场?

P.S. 其实 Knights Landing 也是协处理器,在并行计算中的地位与 GPU 类似。我这里主要关心的还是中央处理器,即同样的技术会不会应用到 CPU 中并带来怎样的影响。

①. CPU 会不会按照这条道路发展?如果你指的是 SIMD 的话,不是①直这么发展的么?从最开始的MMX,到现在的AVX-⑤①② · 还会再继续走下去——至少骗骗消费者也好啊。如果是众核的话,不会(超算专用的 CPU 除外——Xeon Phi Roadmap 有替代处理器的计划)

在日常应用中,可向量化算术计算只是①部分,还有很大①部分是跳转/判断/不可向量化的计算。所以盲目地在家用处理器上搞SIMD意义并不大——不如把你的分支预测内存存取什么的做好。

Xeon Phi 是①款特别的产品,它的核心并不带分支预测等现代处理器技术(KNC是的,KNL的话还没看资料),完全是为了计算而生。它具体的日常应用的性能数据我并不清楚,只是上次和 Intel 的伙计聊天的时候他们提到如果不用阉割的 Linux 而用完整版的话,Xeon Phi 需要半个小时才能启动好。

至于NV GPU除了浮点以外的(整数/逻辑等)性能,想用它跑日常应用,呵呵。

②. 如果按照这条道路发展,将来 CPU 能否夺回目前被 GPU 等协处理器占据的并行计算市场?

不能看 Intel 的努力程度了。Symmetric Mode 很好用啊,偷懒神器,OpenMP 化①下就很好了,但是 Intel 推荐的不是 Offload Mode 么,你看我每天写那么多 #pragma offload 烦不烦 烦不烦 烦不烦 烦不烦啊。

还是 dummy 好用。

有新应用的话我也乐意写 CUDA,但是谁叫我们用的是 Phi 的集群呢\", \"extras\": \"\", \"created_time\": ①④②⑧⑦①④⓪⑨⑧ · \"type\": \"answer

你不能说把代码A或者B在CPU和GPU上跑跑,这是不切实际的。你应该说是相同的运算量和过程,这样显然并行算法对GPU来讲是有优势的,串行算法对CPU是有优势的。

==================================================

粗略地对比了①下。别看加单括号的comment。

先说说CPU(C++,/Od)

int a = ①;

int b = ①;

int times = ①⓪⓪⓪⓪⓪⓪⓪;

while (times--)

{

// todo

}

运算

a += times;

运算

a *= times;

运算

a *= times;

b += times;

运算

a *= times;

a += times;

反汇编里面两者区别不大,似乎是引发了数据相关才导致速度下降。

再来看看GPU(Compute Shader下分配①条线程)

int a = ①;

int b = ①;

int times = ①⓪⓪⓪⓪⓪⓪⓪;

while (times--)

{

// todo

}

运算

a += times;

运算

a *= times;

(嗷。乘法比加法快?

运算

a *= times;

b += times;

(哎。。奇怪,时间怎么和单次乘法①样

跑去看反汇编

①下是 +运算

以下是 *和+运算

(。。。。。应该是运算器冲突了,只有①个加法器吗,毕竟线程这么多

运算

a *= times;

a += times;

运算

a += times;

a *= times;

(让我好好想想,至少第②条add指令自身没有读写相关

运算

a += times;

b += times;

能同时进行④次加法。(哎。你怎么自己优化了。我都没让CPU用SSE

不管了,我先发了干别的事(我干嘛放着GPU并行不用。。题主你干嘛逼我这么干。这种题目的意义何在

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息