"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下载/上传数据的平衡.
| 归档时间: |
|
| 查看次数: |
370 次 |
| 最近记录: |