【发布时间】:2015-03-01 07:34:19
【问题描述】:
我有一个光线追踪算法,它只适用于 1 个线程,我正在尝试让它适用于任意数量的线程。
我的问题是,我可以通过哪种方式在线程之间分配此任务。
起初我的教练告诉我只划分图像的宽度,例如如果我有一个 8x8 的图像,我想要 2 个线程来完成任务,让线程 1 渲染 0 到 3 个水平区域(当然所有垂直向下)和线程 2 渲染 4 到 7 个水平区域。
当我的图像长度和线程数都是 2 的幂时,我发现这种方法非常有效,但我不知道如何处理奇数线程或无法在没有提醒的情况下划分宽度的任意线程.
我解决这个问题的方法是让线程交替渲染图像,例如,如果我有一个 8x8 的图像,并且让我们说如果我有 3 个线程。
线程 1 在水平方向渲染像素 0,3,6
线程 1 在水平方向渲染像素 1,4,7
线程 1 在水平方向渲染像素 2,5
抱歉,我无法提供所有代码,因为有超过 5 个文件,每个文件有几百行代码。
这是在水平区域循环的for循环,垂直循环在其中,但我不打算在这里提供。
我的导师的建议
for( int px=(threadNum*(width/nthreads)); px < ((threadNum+1)*(width/nthreads)); ++px )
threadNum 是我所在的当前线程(意思是线程 0、1、2 等等) width 是图像的宽度 nthreads 是线程的总数。
我对这个问题的解决方案
for( int px= threadNum; px< width; px+=nthreads )
我知道我的问题不是很清楚,很抱歉,但我不能在这里提供整个代码,但基本上我要问的是哪种方式是在给定数量的线程之间划分图像渲染的最佳方式(可以是任何正数)。另外我希望线程按列渲染图像,这意味着我无法触及处理垂直渲染的代码部分。
谢谢,对混乱的问题表示抱歉。
【问题讨论】:
-
分割不会有问题,因为剩下的部分覆盖了剩余部分。
-
很好的答案,谢谢。
标签: c multithreading