最近我总是听说GPU在计算方面非常强大,现在我脑子里出现了一个问题: 我们可以使用CPU更快地解决问题而不是使用GPU吗?
你能举一些例子吗?
答案 0 :(得分:5)
“GPU在计算方面非常强大!” YES!
但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;
如果这是您与C
,A
和B
所做的唯一工作,那么使用GPU可能不会有任何好处,因为开销和成本传输数据超过了使用GPU的任何好处(在这种情况下没有任何好处,因为在这个例子中没有固有的并行性)。
在大多数情况下,纯粹的顺序问题不会从使用GPU中受益,因为单个GPU线程不会比现代CPU线程更快地执行代码。然而,在这里做一个全面的陈述比较困难,因为大多数纯顺序算法可以以并行方式重铸,如果它们在多个独立的数据元素上运行,甚至顺序算法也可以天真地并行化。