我们可以使用CPU更快地解决问题而不是使用GPU吗?

时间:2013-11-01 08:13:06

标签: gpu cpu

最近我总是听说GPU在计算方面非常强大,现在我脑子里出现了一个问题: 我们可以使用CPU更快地解决问题而不是使用GPU吗?

你能举一些例子吗?

2 个答案:

答案 0 :(得分:5)

“GPU在计算方面非常强大!” YES!

但GPU不是“更快的CPU”。你可以用这种方式总结:

  • CPU有一些强大的核心(与GPU相比很强大)。
  • GPU有很多弱核心(与CPU相比较弱)。

我在考虑GPU为GPGPU。由于图形管道,它们实际上有点不同,但想法是一样的!着色器的工作方式与我在此处解释的相同。

GPU基本上是为计算“可并行算法”而设计的。它意味着真正需要打开数百,数千甚至数百万个线程来解决某些确定任务的算法!

一些非常虚拟的例子:

非可并行算法(CPU):

unsigned int X = 0;
unsigned int data[ 10000 ];

fillDataFromSomeWhereWithSomething( data );

for ( unsigned int i = 0; i < 10000; i++ )
{
    X += data[ i ] * data[ i ];
}

对于循环的每个循环,X取决于X的先前值。所以我们没有意义为此打开线程!只有一个流程!一个人必须使用CPU!

可并行化算法(GPU):

int X[ 10000 ] = { 0 };
unsigned int data[ 10000 ];

fillDataFromSomeWhereWithSomething( data );

for ( unsigned int i = 0; i < 10000; i++ )
{
    X[ i ] = data[ i ] * data[ i ];
}

此处,对于X[ ? ]的每个值,结果都很简单,仅取决于i循环是独立的!因此,而不是循环超过10000.您可以使用GPU为您打开10000个线程并并行执行所有循环。

如何运作?

您将输入data从CPU上传到GPU。然后你告诉你的GPU在一个名为kernel的小程序中执行10000个线程。每个内核都有自己的输出。内核将计算:

X_i = data[ i ] * data[ i ];

其中X_i(在GPU中)与X[ i ](在CPU上)相关。 一旦GPU完成了所有10000个线程。结果将下载回CPU,数组X[]将被更新,并带有所需的结果!

重要提示:当然这只是一个虚拟的例子。事实上,这个算法特别简单,超过10000的循环对CPU来说真的不是什么大问题。向/从GPU上传/下载数据需要花费时间!所以它一定值得!

答案

考虑这一切。您可以自己找出哪种算法更适合CPU或GPU。当然,必须始终注意与GPU之间的数据下载/上传的平衡。

答案 1 :(得分:0)

GPU通常将与数据传输到GPU或从GPU传输数据的成本与其相关联。有一些问题可以描述that involve almost no data transfer,但许多问题始于一个必须传输到GPU的数据集,而且总会出现一些需要传回的结果。< / p>

因此,GPU上的小问题是不明智的:

int C = A + B;

如果这是您与CAB所做的唯一工作,那么使用GPU可能不会有任何好处,因为开销和成本传输数据超过了使用GPU的任何好处(在这种情况下没有任何好处,因为在这个例子中没有固有的并行性)。

在大多数情况下,纯粹的顺序问题不会从使用GPU中受益,因为单个GPU线程不会比现代CPU线程更快地执行代码。然而,在这里做一个全面的陈述比较困难,因为大多数纯顺序算法可以以并行方式重铸,如果它们在多个独立的数据元素上运行,甚至顺序算法也可以天真地并行化。