在2010年关于光线投射稀疏体素八叉树(SVO)的论文[1]中(道歉;论文需要一段时间才能加载),第3部分指出了一个有趣的内存设置,以节省体素数据上的空间,这几乎总是非常大.
它们指定一个15位相对指针,带有一个1位标志,用于指定是否需要远指针(如果卷数据太大,则标志置位,并且15位指针被视为指向辅助指针,远指针).
为实现这一目标正在做些什么?这与CUDA/GPU有关吗?它是通过C++代码中的某种自定义分配器完成的吗?
如果有的话,如何在C++中完成?
[1] 高效的稀疏体素八分之一:Samuli Laine,Tero Karras; NVIDIA Research
我知道编译时包含在可执行文件中的代码可以来自目标文件(.o文件)和静态链接库(.lib/.a文件).从根本上和概念上讲这两者之间的区别是什么?为什么"目标代码"和"静态链接库"之间存在不同的概念?各有哪些优点和缺点,为什么使用一个而不是另一个?静态链接库是否可以从目标文件中生成,反之亦然,是否可以从静态链接库中创建目标文件?
HT/SMT背后的主要思想是,当一个线程停止时,同一内核上的另一个线程可以共同选择剩余的内核空闲时间并透明地运行它.
2013年,英特尔放弃了SMT,转而支持Silvermont处理器内核的无序执行,因为他们发现这可以提供更好的性能.
ARM不再支持SMT(出于能源原因).AMD从不支持它.在野外,我们仍然有各种支持它的处理器.
从我的角度来看,如果构建数据和算法是为了不惜一切代价避免缓存未命中和后续处理停滞,那么HT在多核系统中肯定是一个冗余因素吗?虽然我很欣赏上下文切换所涉及的开销很低,因为两个HyperThreads的离散硬件存在于同一物理内核中,但我看不出这比没有上下文切换更好.
我建议,任何需要针对超线程点缺陷的软件设计.这里有什么我想念的吗?
问题说明了一切.
如果我有一个96位字段:
uint32_t flags[3]; //(thanks @jalf!)
Run Code Online (Sandbox Code Playgroud)
考虑到其中的子域可能位于32位边界(例如,从第29位到第35位的字段),我如何最好地访问它?
我需要访问尽可能快,所以我宁愿不将它们作为数组的32位元素进行迭代.
我对OS没有偏好; 任何工具都可以,只要它允许我测量Core 2和i7架构上的缓存性能.
我打算在OpenGL中使用它来进行alpha截断.GLSL中的等价物是否只是
if (gl_FragColor.a < cutoff)
{
discard;
}
Run Code Online (Sandbox Code Playgroud)
还是有一些更有效的等价物?
我想要实际的世界空间距离,我从实验中得到了感觉
(gl_FragCoord.z / gl_FragCoord.w)
是世界空间的深度?但我不太确定.
编辑我刚刚找到了我最初找到这段代码的地方.显然它是相机的实际深度?
......据我了解,他们做同样的事情:提供对Amazon Web Services的访问.有人可以提供这两个库之间不同功能的列表吗?如果亚马逊已经提供产品,为什么还存在knox?
如果我打开JS控制台并写:
let foo;
Run Code Online (Sandbox Code Playgroud)
之后:
let foo = "bar"
Run Code Online (Sandbox Code Playgroud)
控制台告诉我(正确)
Uncaught SyntaxError: Identifier 'foo' has already been declared
Run Code Online (Sandbox Code Playgroud)
现在......有时我需要在现有脚本中注入我的代码,而我没有工具来确定是否已经定义了let变量.
我尝试使用此代码,但JS范围和逻辑存在明显问题....(注释代码)
let foo; // Gloabl variable empty declare in a code far, far away
console.log(foo); // undefined
console.log(typeof foo === "undefined"); // test that determinate if condition is true
if(typeof foo === "undefined"){
let foo = "test";
console.log(foo); // return "test" this means that foo as a local scope only inside this if...
}
console.log(foo); // return undefined not test!
// and …Run Code Online (Sandbox Code Playgroud)我在过去的很多场合都注意到,C和C++代码对这些结构使用了以下格式:
class Vector3
{
float components[3];
//etc.
}
class Matrix4x4
{
float components[16];
//etc.
}
class Quaternion
{
float components[4];
//etc.
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这会导致更好的缓存性能,而不是说:
class Quaternion
{
float x;
float y;
float z;
//etc.
}
Run Code Online (Sandbox Code Playgroud)
...因为我假设类成员和函数在连续的内存空间中,无论如何?我目前使用后一种形式,因为我发现它更方便(但我也可以在数组形式中看到实际意义,因为它允许根据正在执行的操作将轴视为任意).
从受访者那里得到一些建议后,我测试了差异,实际上阵列速度较慢 - 帧率有3%的差异.我实现了operator []来包装Vector3中的数组访问.不确定这是否与它有任何关系,但我怀疑它,因为无论如何应该内联.我能看到的唯一因素是我不能再使用构造函数初始化列表了Vector3(x, y, z).但是当我使用原始版本并将其更改为不再使用构造函数初始化列表时,它的运行速度比以前慢了很多(小于0.05%).毫无头绪,但至少现在我知道原来的方法更快.
c++ ×4
c ×3
glsl ×2
arrays ×1
bit-fields ×1
cpu-cache ×1
cuda ×1
ecmascript-6 ×1
java ×1
javascript ×1
let ×1
linkage ×1
memory ×1
metrics ×1
node.js ×1
object-files ×1
opengl ×1
optimization ×1
performance ×1
pointers ×1
static ×1
variables ×1