我目前正在实现一种在小矩阵和向量上分配线性代数的算法.代码很快,但我想知道在gpgpu而不是cpu上实现它是否有意义.
我能够将大多数矩阵和向量存储在gpu内存中作为预处理步骤,并且具有乘法算法的配置文件,这些算法在gpu上更快.
但现在我的真实问题,
如何确定从cpu调用gpu的开销?我失去了多少个循环以便我的代码被执行以及类似的东西?
我希望有人有一些意见吗?
解决方法:
很难确定调用OpenCL的确切“开销”,因为GPU上的操作可以与CPU上运行的任何其他操作并行完成.
例如,根据您的应用程序,您可以从应用程序中将一大块数据传输到GPU,并且在以下数据块的CPU中进行一些预处理.类似地,当代码在GPU上执行时,您可以在CPU上对将来需要的某些数据进行一些准备工作.
传输到GPU将通过DMA传输完成,这种传输速度非常快.
根据我的经验,我能够以4毫秒的顺序将大约4MB的数据传输到GPU(现代GPU,现代主板),同时对先前发送的数据进行一些处理.
从那时起,似乎可以肯定地说,您可以每秒向GPU上传和下载1GB数据的订单,并对该数据进行一些处理.
在您的情况下,GPU或CPU端将成为瓶颈. CPU端,如果它不能每秒向GPU提供1GB的准备数据.这可能很可能受到磁盘I / O的限制.
要测试GPU路径,请设置一堆准备处理的数据缓冲区.您可能希望继续将该数据重新发送到GPU,处理它并下载结果(您将丢弃).测量吞吐量并与应用程序的CPU版本的吞吐量进行比较.
不要只测量GPU处理部分,因为GPU上的传输和处理将争夺GPU内存控制器的时间并且将影响彼此的速度.
此外,如果您希望在小块数据上获得非常好的响应时间,而不是良好的吞吐量,那么您可能无法通过GPU获益,因为它会给您的处理带来一些延迟.