执行摘要:如何在代码中指定OpenMP应该只为REAL内核使用线程,即不计算超线程的线程?
详细分析:多年来,我在空闲时间编写了一个仅限SW的开源渲染器(光栅化器/光线跟踪器).可以从这里获得GPL代码和Windows二进制文件:https: //www.thanassis.space/renderer.html 它在Windows,Linux,OS/X和BSD下编译并运行良好.
我上个月推出了一种光线追踪模式 - 生成的图片质量飙升.不幸的是,光线跟踪比光栅化要慢几个数量级.为了提高速度,就像我对光栅化器一样,我为光线跟踪器添加了OpenMP(和TBB)支持 - 以便轻松利用额外的CPU内核.光栅化和光线跟踪都很容易进行线程化(每个三角形工作 - 每像素工作).
在家里,凭借我的Core2Duo,第二核心帮助了所有模式 - 光栅化和光线跟踪模式的加速都在1.85x和1.9x之间.
问题:当然,我很想看到CPU的最高性能(我也玩"GPU",初步的CUDA端口),所以我想要一个坚实的基础进行比较.我把代码交给了我的一个好朋友,他可以使用16英寸,1500美元英特尔超级处理器的"野兽"机器.
他以"最重"模式运行它,光线跟踪模式......
......他的速度是我的Core2Duo的五分之一(!)
喘气 - 恐怖.刚刚发生了什么?
我们开始尝试不同的修改,补丁,......最终我们弄明白了.
通过使用OMP_NUM_THREADS环境变量,可以控制生成的OpenMP线程数.随着线程数从1增加到8,速度增加(接近线性增加).在我们越过8的那一刻,速度开始减弱,直到我的Core2Duo速度的五分之一,当使用所有16个核心时!
为什么8?
因为8是真实核心的数量.其他8个是...超线程的!
理论:现在,这对我来说是新闻 - 我看到超线程在其他算法中帮助很多(高达25%),所以这是出乎意料的.显然,即使每个超线程核心都有自己的寄存器(和SSE单元?),光线跟踪器也无法利用额外的处理能力.这引导我思考......
它可能不是缺乏处理能力 - 它是内存带宽.
光线跟踪器使用边界体积层次结构数据结构来加速光线三角形交叉.如果使用的芯超线程,则每个在一对"逻辑核"的,试图从在该数据结构不同的地方(即,在存储器中),以读 - 和CPU高速缓存(每对本地)完全捶打.至少,这是我的理论 - 任何建议都是最受欢迎的.
所以,问题是: OpenMP检测"核心"的数量并产生与之匹配的线程 - 也就是说,它包括计算中的超线程"核心".就我而言,这显然会导致灾难性的结果,速度方面.有谁知道如何使用OpenMP API(如果可能的话,可移植)只为REAL内核生成线程,而不是超线程的线程?
PS代码是开放的(GPL),可在上面的链接中找到,随时可以在您自己的机器上重现 - 我猜这将在所有超线程CPU中发生.
PPS原谅帖子的长度,我认为这是一种教育经历,想分享.
我想知道是否有可能在对象创建时选择性地抑制Django信号(例如post_save或post_init),或者,发送它某些参数.
我所拥有的是一个User对象,可以在我的代码中以多种不同的方式创建.因此,要自动Profile为每个对象分配一个自定义对象User,我使用该post_save信号.但是,在一个特定情况下,我想要绑定到创建的Profile对象的额外信息.将它作为post_save信号的参数传递将是很好的,但它看起来不可能.
另一种选择是手动创建Profile对象,但是在User保存之后我需要这样做,否则Profile无法绑定到User实例.User但是,保存实例会导致Profile通过信号调用的函数创建另一个实例.
而且我不能只获得刚刚创建的Profile对象,因为这会导致'Profile' object is unsubscriptable错误.有什么建议?
更新:
以下是可能情况的示例:
def createUserProfile(sender, instance, created, **kwargs):
if created:
profile, created = Profile.objects.get_or_create(user=instance)
if extra_param:
profile.extra_param = extra_param
profile.save()
post_save.connect(createUserProfile, sender=User)
def signup(request):
...
extra_param = 'param'
user.save()
Run Code Online (Sandbox Code Playgroud)
如何extra_param将signup方法中的变量获取到createUserProfile方法,在该方法中将变量存储为Profile对象的一部分?
问题:Sql dateTime列包含对其有时间限制的旧数据.我有一个带有日期选择器的MVC表单,允许用户选择日期并从具有该日期的数据库中恢复所有记录.
然而,我的问题是linq to sql是数据模型的文字,我不能将datetime colum转换为日期仅用于比较.下面是一段代码片段
myDateSelected = 27/01/2011
p.PostedDate在数据库中将等于27/01/2001 17:09:00
var p from products
where p.PostedDate == myDateSelected
select p
Run Code Online (Sandbox Code Playgroud)
如何强制p.PostedDate删除时间元素以使比较工作?
Linq很新,到目前为止找不到我的问题的解决方案.
我正在寻找一种方法来选择核心转储中包含的部分和内存区域.
我的应用程序的核心转储大小约为30GB,大部分都在预先分配的缓冲区中,我甚至不需要在调试中(以后可以归零).但是,由于转储太大,应用程序完成崩溃并开始恢复需要花费太多时间.
任何人都可以想到一种方法来提前选择哪些细分市场将在核心转储中?
谢谢
处理发送多播数据包的项目,接收者可以根据需要选择加入/退出组.我注意到有两种加入/离开组的方法:IP_ADD_MEMBERSHIP/IP_DROP_MEMBERSHIP和IP_ADD_SOURCE_MEMBERSHIP/IP_DROP_SOURCE_MEMBERSHIP.无法从这里的手册页中得到任何东西,所以把这个扔给SO大师.有什么区别,如果有的话,你能举例说明何时使用一个而不是另一个?
你应该如何实现那种例如Honeycomb Gmail客户端使用的滑动?
可以TransactionManager通过添加和删除片段自动处理这个,由于模拟器是幻灯片,所以很难测试这个:)
在NetBeans中,如何将"Java应用程序"项目转换为"Web应用程序"项目?
我正在设计一个VST音频插件,它需要从输入信号中提取幅度数据,以用于midi域中的速度设置.
本质上,我将接收0-1(浮点数)之间的值,并需要将它们转换为0-127 int.
目前,该过程将浮点值乘以100得到+3小数位的整数值,即103.4567685或005.6778787282
从这里开始,我将使用floor()函数将浮点数舍入到整数.
但是,这将使我的值在0-100之间; 但是,我需要将它们缩放到0-127.
关于如何使这成为可能的任何建议将不胜感激.
任何人都能告诉我是否存在Android的setInterval/setTimeout的等价物?有人有任何关于如何做的例子吗?