Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading GPU与多核?_Multithreading_Performance_Multicore_Gpgpu_Parallel Processing - Fatal编程技术网

Multithreading GPU与多核?

Multithreading GPU与多核?,multithreading,performance,multicore,gpgpu,parallel-processing,Multithreading,Performance,Multicore,Gpgpu,Parallel Processing,从程序员的角度来看,GPGPU和常规多核/多线程CPU编程之间的关键实际区别是什么?具体而言: 什么类型的问题更适合常规多核,什么类型的问题更适合GPU 编程模型的主要区别是什么 什么是导致编程模型差异的关键底层硬件差异 哪一个更容易使用?使用多少 从长远来看,为GPU实现高级并行库(如or)是否切实可行 如果GPU计算如此高效,为什么CPU的设计不更像GPU 即使在多核CPU中,您的工作单元也将比GPGPU大得多。GPGPU适用于可伸缩性非常好的问题,每一块工作都非常小。GPGPU的延迟要高

从程序员的角度来看,GPGPU和常规多核/多线程CPU编程之间的关键实际区别是什么?具体而言:

  • 什么类型的问题更适合常规多核,什么类型的问题更适合GPU

  • 编程模型的主要区别是什么

  • 什么是导致编程模型差异的关键底层硬件差异

  • 哪一个更容易使用?使用多少

  • 从长远来看,为GPU实现高级并行库(如or)是否切实可行

  • 如果GPU计算如此高效,为什么CPU的设计不更像GPU


即使在多核CPU中,您的工作单元也将比GPGPU大得多。GPGPU适用于可伸缩性非常好的问题,每一块工作都非常小。GPGPU的延迟要高得多,因为您必须先将数据移动到GPU的内存系统,然后才能访问它。然而,一旦数据存在,如果问题具有适当的可伸缩性,那么GPU的吞吐量将高得多。根据我的经验,GPGPU编程的问题是从普通内存获取数据到GPGPU的延迟

此外,如果工作进程没有局部范围路由,那么GPGPU在工作进程之间通信时非常糟糕。如果你想通过GPGPU一路交流,你会很痛苦。因此,标准MPI库不适合GPGPU编程


并非所有的计算机都像GPU那样设计,因为GPU在高延迟、高吞吐量计算方面非常出色,这些计算本质上是并行的,并且很容易分解。CPU所做的大部分工作本质上不是并行的,并且不能非常有效地扩展到数千或数百万同时工作的工人。幸运的是,图形编程确实如此,这就是为什么所有这些都是从GPU开始的。人们越来越多地发现他们可以使问题看起来像图形问题,这导致了GPGPU编程的兴起。然而,GPGPU编程只有在适合您的问题领域时才真正值得您花费时间。

有趣的问题。我研究过这个问题,所以我的答案是基于一些参考资料和个人经验

哪些类型的问题更适合常规多核,哪些类型的问题更适合GPGPU?

就像@Jared提到的那样。GPGPU是为非常常规的吞吐量工作负载而构建的,例如,图形、密集矩阵乘法、简单的photoshop过滤器等。它们擅长容忍长延迟,因为它们固有的设计允许纹理采样,1000+周期的操作。GPU内核有很多线程:当一个线程触发长延迟操作(比如内存访问)时,该线程将处于睡眠状态(其他线程继续工作),直到长延迟操作完成。这使得GPU的执行单元比传统的内核更繁忙

GPU不擅长处理分支,因为GPU喜欢将“线程”(如果您不是nVidia,则为SIMD通道)批处理成多个线程,然后将它们一起发送到管道中,以节省指令获取/解码能力。如果线程遇到分支,它们可能会发散,例如,8线程经纱中的2个线程可能会接受分支,而其他6个线程可能不会接受分支。现在,必须将扭曲拆分为大小为2和6的两个扭曲。如果你的核心有8条SIMD通道(这就是为什么原来的warp封装了8条线程),那么现在你的两条新形成的warp将无法有效运行。2线经纱将以25%的效率运行,6线经纱将以75%的效率运行。您可以想象,如果GPU继续遇到嵌套分支,其效率将变得非常低。因此,GPU不擅长处理分支,因此带有分支的代码不应该在GPU上运行

GPU也是一个不好的合作线程。如果线程需要相互通信,那么GPU将无法正常工作,因为GPU上不支持同步(但nVidia支持)

因此,GPU最差的代码是并行性较差的代码,或者是分支或同步较多的代码

编程模型的主要区别是什么?

GPU不支持中断和异常。对我来说,这是最大的区别。除此之外,CUDA与C没有太大区别。您可以编写一个CUDA程序,将代码发送到GPU并在那里运行。您在CUDA中访问内存的方式有点不同,但这并不是我们讨论的基础

什么是导致编程模型差异的关键底层硬件差异?

我已经提到了。最大的问题是GPU的SIMD特性,它要求代码以非常规则的方式编写,没有分支和线程间通信。例如,这就是CUDA限制代码中嵌套分支数量的部分原因

哪一个更容易使用?具体使用多少?

这取决于您正在编写的代码以及您的目标是什么

易于矢量化的代码:CPU更易于编码,但性能较低。GPU稍难编码,但却带来了巨大的好处。 对于所有其他人来说,CPU更容易,而且性能通常也更好

从长远来看,为GPU实现高级并行库(如Microsoft的task parallel library或D的std.parallelism)是否切实可行?

根据定义,任务并行性需要线程通信,并且具有分支。任务的概念是不同的线程做不同的事情。GPU是为做相同事情的许多线程设计的。我不会为GPU构建任务并行库

如果GPU计算如此强大