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

Jer*_*rry 1 cpu gpu

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

你能举个例子吗?

Wag*_*ota 5

"GPU在计算方面非常强大!" 是!

但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 ];
}
Run Code Online (Sandbox Code Playgroud)

对于循环的每个循环,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 ];
}
Run Code Online (Sandbox Code Playgroud)

在这里,对于每个值X[ ? ],结果都是直接依赖的i.周期是独立的!因此,而不是循环超过10000.您可以使用GPU为您打开10000个线程并并行执行所有循环.

这个怎么运作?

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

X_i = data[ i ] * data[ i ];
Run Code Online (Sandbox Code Playgroud)

其中X_i(在GPU中)与X[ i ](在CPU上)相关.一旦GPU完成了所有10000个线程.将结果下载回CPU,并X[]使用所需结果更新阵列!

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

答案

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

  • 您的"不可并行算法(CPU)"是*高度可并行化的.这是向量范数函数的基本部分,许多并行库实现了它,包括CUBLAS.第一步是对每个元素执行`data [i]*data [i];`,这是完全独立且令人难以置信的并行.第二步是执行经典的并行缩减.你需要更加努力地工作才能想出一个"不可并行化"的例子. (3认同)