打个电话要花多少时间?



我目前正在实现一个算法,它在小矩阵和向量上分配线性代数。代码很快,但我想知道它是否会有意义实现它在gpgpu而不是cpu上。

我能够将大多数矩阵和向量存储在gpu内存中作为预处理步骤,并且具有乘法算法的配置文件,当然,这些算法在gpu上更快。

但是现在我真正的问题是,我如何确定从cpu调用gpu的开销?我在代码执行过程中丢失了多少个周期?

我希望有人有一些建议?

很难确定调用OpenCL的确切"开销",因为GPU上的操作可以与CPU上运行的任何其他操作并行完成。例如,根据您的应用程序,您可以将应用程序中的数据块传输到GPU,并同时在CPU中对接下来的数据块进行一些预处理。类似地,当代码在GPU上执行时,您可以在CPU上对将来需要的一些数据做一些准备工作。

向GPU的传输将通过DMA传输完成,这通常非常快。根据我的经验,我能够以4毫秒的顺序将大约4MB的数据传输到GPU(现代GPU,现代主板),同时对先前发送的数据进行一些处理。由此看来,你似乎可以安全地说,你可以上传和下载每秒1GB的数据到GPU,并对这些数据进行一些处理。

在您的情况下,GPU或CPU端将成为瓶颈。CPU端,如果它不能每秒向GPU提供1GB的准备数据。这很可能受到磁盘I/o的限制。

要测试你的GPU路径,设置一堆准备处理的数据缓冲区。您可能希望继续将该数据重新发送到GPU,处理它并下载结果(您将丢弃)。测量吞吐量,并与您的CPU版本的应用程序的吞吐量进行比较。

不要只测量GPU处理部分,因为GPU上的传输和处理会竞争GPU内存控制器的时间,并且会影响彼此的速度。

同样,如果你想在小块数据上有很好的响应时间,而不是很好的吞吐量,你可能不会从GPU中受益,因为它会给你的处理带来一点延迟。

这里要考虑的重要事情是将数据复制到GPU并返回所需的时间。即使GPU的实现要快得多,花在传输上的时间也可能会抵消任何优势。

此外,如果你非常重视代数的精度,那么你可能要考虑到你想要执行的操作可能无法在GPU上本机使用双精度。

考虑到你说你的矩阵和向量很小,我建议检查SIMD优化,这可能会提高你的算法在CPU上的性能。

您可以使用clEvent对象来跟踪实际计算所花费的时间(延迟)。如果您实际上指的是CPU周期,请使用RDTSC(或其内在的MSVC中的__rdtsc)为实际的API调用执行纳秒级精确的计时。RDTSC指令(读取时间戳计数器)返回cpu自上电以来完成的时钟周期数。

如果它真的很容易上传,那么你可以批量调用,或者在你的nrange中添加一个维度,以便在一次调用中进行多次计算。当然,细节取决于您的内核实现。

我建议使用以下方法来度量cpu周期的数量:

#include <stdlib.h>
#include <time.h>
// ...
clock_t start,end;
start = clock();
// do stuff...
end = clock();
cout<<"CPU cycles used: "<<end-start;

相关内容

  • 没有找到相关文章

最新更新