小编rec*_*ecp的帖子

AVX mat4 inv实现比SSE慢

我在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)

performance sse intel matrix avx

2
推荐指数
1
解决办法
155
查看次数

帧缓冲存储哪些状态?

我创建了一个离屏帧缓冲区,并为其添加了两个渲染目标.

每个渲染目标都有自己的混合模式.我设置它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);但它似乎是全局状态而不是帧缓冲状态.

我不知道帧缓冲存储有多少或哪些状态.特别是我想知道关于帧缓冲附件的这些状态:

  1. glBlendFunci
  2. glBlendFunc
  3. glEnable(GL_BLEND)
  4. glEnable(GL_DEPTH_TEST)
  5. glDepthMask

帧缓冲存储这些状态中的任何一种吗?如果您想分享,我也想知道其他州.

我知道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)

opengl framebuffer

1
推荐指数
1
解决办法
121
查看次数

使用函数参数作为变量

在函数内部重新分配函数参数是不好还是好的做法,或者可能是未定义的行为?

让我用一个例子解释一下我想要做什么,这里是函数:

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 是递归的,会发生什么?我很困惑,因为函数会调用自身,但我认为在每次调用中,参数都会有不同的堆栈

c function c99 c89 function-parameter

0
推荐指数
1
解决办法
100
查看次数

标签 统计

avx ×1

c ×1

c89 ×1

c99 ×1

framebuffer ×1

function ×1

function-parameter ×1

intel ×1

matrix ×1

opengl ×1

performance ×1

sse ×1