我正在阅读这篇文章(非常好的文章和优秀的博客顺便说一句),以便在我的(非常简单的)Mandelbrot Set 实现中进行一些测量。
我使用的是 Quadro 2000D 卡,其理论带宽约为 20 GB/s(= 1304 MHz * 128 位总线)。
Mandelbrot 图像具有 700x700 像素(uchar = 每像素 1 个字节)。使用网格(44,44)和块(16,16)启动内核,计算它所用的时间是 1.00026 毫秒。
现在,如果我的计算很好,那么我有以下
我应该如何解释这个结果?我只使用了大约 2.5% 的带宽,这很糟糕,但是由于算法只对每个像素进行一次写入,所以没有办法改善这一点,是吗?有什么我没有考虑到的吗?
更新
我做了三种类型的内核来查看发生了什么并将图像的大小减小到 250x250。
首先非常幼稚,1 个线程完成所有工作:125 毫秒 + 3.1% 全局效率存储 + 2% 占用率。这是不好的。
二、每行一个线程:0.20 ms + 97.7% 全局存储效率 + 16% 占用率。好多了。
第三,每个元素一个线程:0.25 毫秒,50% 全局存储效率 + 55% 占用率。比上一个差。
那么,从这里我可以做些什么来改进呢?有办法吗?在第三种类型中,我唯一想到的是在内核内部写入共享内存,然后进行同步,然后所有线程都写入全局内存,以便进行合并访问。