我在SSE2和AVX中实现了4x4矩阵逆.两者都比普通实现更快.但是如果启用AVX(-mavx),则SSE2实现比手动AVX实现运行得更快.似乎编译器使我的SSE2实现与AVX更友好:(
在我的AVX实现中,乘法次数减少,添加次数减少......所以我希望AVX可以比SSE更快.也许有些像说明资讯_mm256_permute2f128_ps
,_mm256_permutevar_ps/_mm256_permute_ps
使得AVX慢?我不是要将SSE/XMM寄存器加载到AVX/YMM寄存器.
如何使我的AVX实现比SSE更快?
我的CPU:Intel(R)Core(TM)i7-3615QM CPU @ 2.30GHz(Ivy Bridge)
Plain with -O3 : 0.045853 secs
SSE2 with -O3 : 0.026021 secs
SSE2 with -O3 -mavx: 0.024336 secs
AVX1 with -O3 -mavx: 0.031798 secs
Updated (See bottom of question) all have -O3 -mavx flags:
AVX1 (reduced div) : 0.027666 secs
AVX1 (using rcp_ps) : 0.023205 secs
SSE2 (using rcp_ps) : 0.021969 secs
Run Code Online (Sandbox Code Playgroud)
初始矩阵:
Matrix (float4x4):
|0.0714 -0.6589 0.7488 2.0000|
|0.9446 0.2857 0.1613 4.0000|
|-0.3202 0.6958 0.6429 6.0000|
|0.0000 …
Run Code Online (Sandbox Code Playgroud) 我创建了一个离屏帧缓冲区,并为其添加了两个渲染目标.
每个渲染目标都有自己的混合模式.我设置它glBlendFunci
:
glBlendFunci(accum->buffId, GL_ONE, GL_ONE);
glBlendFunci(revealage->buffId, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
Run Code Online (Sandbox Code Playgroud)
framebuffer是否存储此混合模式?因为它特定于缓冲区.我应该在每一帧或仅在初始化代码中设置它吗?
屏幕外的帧缓冲也不会写入深度,所以我禁用了它,glDepthMask(GL_FALSE);
但它似乎是全局状态而不是帧缓冲状态.
我不知道帧缓冲存储有多少或哪些状态.特别是我想知道关于帧缓冲附件的这些状态:
帧缓冲存储这些状态中的任何一种吗?如果您想分享,我也想知道其他州.
我知道VAO对象存储了一些关于顶点属性的状态,所以我认为framebuffer也可能存储一些与其附件有关的状态
编辑:我更新了glBlendFunci参数以使用绘制索引,我使用了bufferId/objectId
glBlendFunci(accum->drawIndex, GL_ONE, GL_ONE);
glBlendFunci(revealage->drawIndex, GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
Run Code Online (Sandbox Code Playgroud) 在函数内部重新分配函数参数是不好还是好的做法,或者可能是未定义的行为?
让我用一个例子解释一下我想要做什么,这里是函数:
void
gkUpdateTransforms(GkNode *node /* other params */) {
GkNode *nodei;
if (!(nodei = node->chld))
return;
do {
/* do job */
nodei = nodei->next;
} while (nodei);
}
Run Code Online (Sandbox Code Playgroud)
选择:
void
gkUpdateTransforms2(GkNode *node /* other params */) {
/* node parameter is only used here to get chld, not anywhere else */
if (!(node = node->chld))
return;
do {
/* do job */
node = node->next;
} while (node);
}
Run Code Online (Sandbox Code Playgroud)
我检查了程序集输出,看起来是一样的,我们不需要在第二个输出中声明变量。您可能会问,如果参数类型发生变化,但第一个条件相同怎么办,因为它也需要更新。
编辑:参数是按值传递的,我的目的不是编辑指针本身
EDIT2:递归函数怎么样?如果 gkUpdateTransforms2 是递归的,会发生什么?我很困惑,因为函数会调用自身,但我认为在每次调用中,参数都会有不同的堆栈