我正在尝试使用并行化来提高绘制具有分层排序对象的 3D 场景的刷新率。场景绘制算法首先递归遍历对象树,然后构建绘制场景所需的基本数据的有序数组。然后它多次遍历该数组以绘制对象/叠加层等。因为从我读到的 OpenGL 不是线程安全的 API,我假设数组遍历/绘图代码必须在主线程上完成,但我我在想我也许可以并行化填充数组的递归函数。关键是数组必须按照对象在场景中出现的顺序填充,因此所有将给定对象与数组索引相关联的功能都必须以正确的顺序完成,但是一旦分配了数组索引,我可以使用工作线程填充该数组元素的数据(这不一定是微不足道的操作)。所以这是我试图得到的伪代码。我希望您了解 xml-ish 线程语法。
recursivepopulatearray(theobject)
{
<main thread>
for each child of theobject
{
assign array index
<child thread(s)>
populate array element for child object
</child thread(s)>
recursivepopulatearray(childobject)
}
</main thread>
}
那么,是否可以使用 OpenMP 来实现这一点?如果可以,如何实现?是否有其他并行化库可以更好地处理这个问题?
附录:回应Davide's request for more clarification ,让我更详细地解释一下。假设场景是这样排序的:
-Bicycle Frame
- Handle Bars
- Front Wheel
- Back Wheel
-Car Frame
- Front Left Wheel
- Front Right Wheel
- Back Left Wheel
- Back Right Wheel
现在,这些对象中的每一个都有大量与之关联的数据,即位置、旋转、大小、不同的绘图参数等。此外,我需要多次遍历此场景才能正确绘制它。一个 channel 绘制对象的形状,另一个 channel 绘制描述对象的文本,另一个 channel 绘制对象之间的连接/关联(如果有的话)。不管怎样,如果我必须多次访问它们,从这些不同的对象中获取所有的绘图数据是相当慢的,所以我决定使用一次传递将所有这些数据缓存到一个一维数组中,然后所有实际的绘图过程只看数组。要注意的是,因为我需要以正确的顺序执行 OpenGL 压入/弹出,所以数组必须采用代表树层次结构的正确深度优先搜索顺序。在上面的示例中,数组必须按如下方式排序:
index 0: Bicycle Frame
index 1: Handle Bars
index 2: Front Wheel
index 3: Back Wheel
index 4: Car Frame
index 5: Front Left Wheel
index 6: Front Right Wheel
index 7: Back Left Wheel
index 8: Back Right Wheel
因此,数组的顺序必须正确序列化,但是一旦我正确分配了该顺序,我就可以并行填充数组。例如,一旦我将 Bicycle Frame 分配给索引 0 并将 Handle Bars 分配给索引 1,一个线程可以填充 Bicycle Frame 的数组元素,而另一个线程可以填充 Handle Bars 的数组元素。
好的,我想在澄清这一点时,我已经回答了我自己的问题,所以谢谢 Davide。所以我发布了自己的 answer .
最佳答案
我认为你应该更好地澄清你的问题(例如,究竟什么必须连续完成以及为什么)
OpenMP(与许多其他并行化库一样)不保证各个并行部分的执行顺序,并且由于它们是真正并行的(在多核机器上),因此可能存在竞争条件如果不同的部分写入相同的数据。如果这可以解决您的问题,那么您当然可以使用它。
关于c++ - 递归函数上的 OpenMP 并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835893/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时