【问题标题】:how much time does it take to make a call to opencl?调用opencl需要多少时间?
【发布时间】:2012-12-13 14:11:25
【问题描述】:

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

我能够将大部分矩阵和向量存储在 gpu 内存中作为预处理步骤,并配置乘法算法,这些算法在 gpu 上当然要快得多。

但现在我的真正问题是, 如何确定从 cpu 调用 gpu 的开销?我失去了多少周期才能执行我的代码之类的东西?

我希望有人能提供一些意见?

【问题讨论】:

    标签: c++ opencl linear-algebra gpgpu


    【解决方案1】:

    很难确定调用 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 中受益,因为它会给您的处理带来一点延迟。

    【讨论】:

      【解决方案2】:

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

      此外,如果您对代数的准确性非常认真,那么您可能需要考虑到您想要执行的操作可能无法在 GPU 上以双精度原生提供。

      鉴于您说您的矩阵和向量很小,我建议您检查一下 SIMD 优化,这可能会提高您的算法在 CPU 上的性能。

      【讨论】:

      • 我很幸运,我必须为每次调用传输的数据可以归结为一个整数。所以转移可以忽略,真正的问题是设置内核调用和执行调用时的时间延迟。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 该解决方案的问题在于clock() 的分辨率约为15-25ms。所以在小时间尺度上它根本不准确:-(
        • 也许调用你的函数 10000 次?
        • 此解决方案将不起作用,因为您要么将 10000 次呼叫流式传输到卡并等待它们全部返回 - 包括返回时间。或者等待个人回电。我不是故意害虫,但一定有更好的办法。
        猜你喜欢
        • 1970-01-01
        • 2013-04-28
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多