一个线程处理一个像素和一个线程处理一个区域的问题

刚编了个简单的处理图片程序,同学说我那个是一个线程处理一个像素的,建议我改成一个线程处理一个块( 把图片分成好多块 )。我思考了一下还是不得其解,是不是在 Kernel 函数前设置好 block 和 grid ,再相应的修改一下Kernel内部代码,就算实现一个线程处理一块了?望大神解惑,需要哪部分的代码我可以贴上来。。
(本也打算从 CUDA Samples 中学习一下,但我是个菜鸟,看了那些代码,感觉有点吃力,勿喷)

LZ您好

1:无法评估和回答您的关于某图像处理算法使用一个线程处理一个像素比较好还是一个线程处理多个像素比较好。

2:“是不是在 Kernel 函数前设置好 block 和 grid ,再相应的修改一下Kernel内部代码,就算实现一个线程处理一块了?”——无法评价此想法,因为所有的算法都是需要设置合适的block和grid维度,并辅以合适的代码。因此无法评价这样能否满足您一个线程处理一个块的要求。

3:建议您参考CUDA C Programming Guide和CUDA by Example里面的内容以想清楚您的问题的实现方法。以及,简单地,你在kernel里面加个循环并维护好相应的寻址就可以实现一个线程计算多个像素。以及,如果一个线程计算相邻像素组成的一个集合,那么可能会引起访存效率的下降。

大致如上,请LZ仔细思考。

祝您好运~

多谢斑竹的细致解答,我再看看,针对“以及,如果一个线程计算相邻像素组成的一个集合,那么可能会引起访存效率的下降”,收获很大,谢谢斑竹

如果一个线程计算相邻像素组成的一个集合,那么可能会引起访存效率的下降。这句话版主能不能给解释下原因呢?新手看不懂,谢谢

您好,因为一般要求相邻线程访问相邻的地址空间,如此才能使得多个相邻线程一起使用一次访存的结果,这就是合并访问。

大致如此。

祝您编码顺利~

我还有2个问题希望版主能够帮忙解答,不胜感激。
1、计算能力1.x的芯片是以 half warp为单位进行存储访问的,那计算能力2.x的芯片是不是以整个warp为单位存储访问?
2、所谓coalescing ,就是不仅要求访问连续的存储单元,还对访问的起始地址有要求。那如果用的是纹理内存对于楼主的问题每个线程访问一个区域是否可行呢?

您好:

1:2.x的硬件是以warp为单位访存的,如果是完全合并的访问,一个warp每线程访问4B的访存,一般会合并为128B的一次访存,如果每线程访问8B,那么会分为两次128B的访存。

2:您好,关于合并访问,不同硬件版本的要求是不同的,自fermi起,因为引入的L2 cache,所以对合并访问的要求大为下降。具体合并访问的要求请参阅programming guide。以及自fermi开始,在不对齐的情况下,如果局部性要求满足,访存效率还是比较高的,如果不是访存为瓶颈,可以先不管对齐的优化。

以及,LZ的具体算法没有给出,无法对其建议。以及LZ没有给出使用的硬件情况,所以也无法针对计算能力版本给出建议。根据现有信息目测,似乎直接用global memory就挺好。

大致如上,供您参考。

祝您好运!

感谢版主的不吝赐教。

您好,不客气的,非常荣幸为您服务!

也欢迎您经常来论坛讨论问题~

祝您编码顺利~