我正在编写光线转换游戏引擎。 可以在不知道其他射线的情况下计算每条射线(我只计算距离)。 由于计算之间没有等待时间,我想知道使光线计算多线程化是否值得。 性能是否有可能提升?
最佳答案
如果处理得当,多线程很可能会提高性能。按照您陈述问题的方式,它是多线程的完美候选者,因为计算是独立的,从而将线程之间的协调需求降至最低。
您仍然可能无法获得加速,或者可能无法获得预期的全部速度的一些原因可能包括:
1) 瓶颈可能不是片上 CPU 执行资源(例如,ALU 绑定(bind)操作),而是一些共享的东西,例如内存或共享 LLC 带宽。
例如,在某些架构上,单个线程可能会使内存带宽饱和,因此添加更多内核可能无济于事。更常见的情况是单个内核可以饱和一些分数,主内存带宽的 1/N < 1,并且该值大于="" 1/c,其中="" c="" 是内核数。例如,在="" 4="" 芯盒上,一个核心可能会消耗="" 50%="" 的带宽。然后,对于内存受限的计算,您将很好地扩展到="" 2="" 个内核(使用="" 100%="">
核心之间共享的其他资源包括磁盘和网络 IO、GPU、监听带宽等。如果您有超线程平台,此列表会增加以包括共享相同逻辑核心的所有级别的缓存和 ALU 资源物理核心。
2) “理论上”独立的操作之间的“实践中”争论。
您提到您的运营是独立的。通常这意味着它们逻辑上独立 - 它们不共享任何数据(除了可能不可变的输入)并且它们可以写入单独的输出区域。然而,这并不排除任何给定的实现实际上都在进行一些隐藏共享的可能性。
一个典型的例子是错误共享——自变量落在同一个缓存行中,因此逻辑上独立的从不同线程写入不同的变量最终会破坏内核之间的缓存行。
在实践中经常遇到的另一个例子是通过库进行争用 - 如果您的例程大量使用 malloc,您可能会发现所有线程大部分时间都在等待分配器内的锁,因为 malloc 是共享资源。这可以通过减少对 malloc 的依赖(可能通过更少、更大的 malloc)或使用良好的并发 malloc(例如 hoard 或 tcmalloc)来补救。
3) 跨线程实现计算的分发和收集可能会压倒您从多线程获得的优势。例如,如果您为每条单独的光线启动一个新线程,线程创建开销将主导您的运行时,您可能会看到负面 yield 。即使您使用持久线程的线程池,选择粒度太细的“工作单元”也会带来大量协调开销,这可能会抵消您的优势。
同样,如果您必须将输入数据复制到工作线程或从工作线程复制输入数据,您可能看不到预期的缩放。在可能的情况下,对只读数据使用按引用传递。
4) 您没有超过 1 个核心,或者您有超过 1 个核心但它们已经被其他线程或进程占用。在这些情况下,协调多个线程的工作是纯粹的开销。
关于c++ - 如果我有固定数量的相互独立的计算,多线程是否会显着提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25370160/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
如何将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.你能做的最好的事情是:
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?
我是ruby的新手,我认为重新构建一个我用C#编写的简单聊天程序是个好主意。我正在使用Ruby2.0.0MRI(Matz的Ruby实现)。问题是我想在服务器运行时为简单的服务器命令提供I/O。这是从示例中获取的服务器。我添加了使用gets()获取输入的命令方法。我希望此方法在后台作为线程运行,但该线程正在阻塞另一个线程。require'socket'#Getsocketsfromstdlibserver=TCPServer.open(2000)#Sockettolistenonport2000defcommandsx=1whilex==1exitProgram=gets.chomp
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我