小编Mar*_*Zzz的帖子

有没有一种有效的方法可以使用SIMD内在函数在SIMD寄存器中获得第一个非零元素?

如标题所示,如果256位SIMD寄存器是:

0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |

我怎样才能最有效地获得第一个非零元素(即该指数的指数2第一的1)?最直接的方法是将其存储到内存中并逐个检查,但这可能会花费很多.有没有可爱的想法呢?

x86 bit-manipulation simd intrinsics avx

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

CPU后端使用TensorFlow XLA-JIT的操作融合性能

谁能给我任何提示,为什么 XLA-JIT 在 CPU 后端具有更好的性能?

我在单个 CPU上的mnist基准测试中尝试了不带和带 XLA-JIT(手动模式)的 TensorFlow 。使用 XLA-JIT 与不使用 XLA-JIT 的 TensorFlow 相比实现了 13.6 倍的加速。

由于在说XLA-JIT的优点时经常提到操作融合,我自然认为可能是这种技术背后的原因,所以我学习了源代码,发现融合过程大致是这样的(如有错误请指正) ):

  1. 检查 HloComputation (CompOld) 中是否有可以融合的操作;
  2. 如果是,则在 CompOld 中增加一条新的 Fusion 指令,并从 CompOld 中移除融合操作;
  3. 然后创建一个由融合操作组成的新 HloComputation (CompNew)。CompOld 中添加的 Fusion 指令有一个指向 CompNew 的指针。
  4. 当涉及到后端时,为 CompOld 和 CompNew 独立发出 LLVM IR。

考虑到显着的性能改进,我认为肯定还有更多我错过或误会的地方。我可以给你建议吗?

cpu mnist tensorflow tensorflow-xla

6
推荐指数
0
解决办法
551
查看次数

使用具有SIMD内部数据类型的STL向量

正如标题所示,我试图使用具有SIMD内在数据类型的STL向量.我知道由于加载/存储的潜在开销,这不是一个好习惯,但我遇到了一个非常奇怪的错误.这是代码:

#include "immintrin.h"
#include <vector>
#include <stdio.h>

#define VL 8

int main () {
    std::vector<__m256> vec_1(10);
    std::vector<__m256> vec_2(10);

    float * tmp_1 = new float[VL];
    printf("vec_1[0]:\n");
    _mm256_storeu_ps(tmp_1, vec_1[0]); // seems to go as expected
    for (int i = 0; i < VL; ++i)
        printf("%f ", tmp_1[i]);
    printf("\n");
    delete tmp_1;

    float * tmp_2 = new float[VL];
    printf("vec_2[0]:\n");
    _mm256_storeu_ps(tmp_2, vec_2[0]); // segmentation fault
    for (int i = 0; i < VL; ++i)
        printf("%f ", tmp_2[i]);
    printf("\n");
    delete tmp_2;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我用它编译了它g++ …

simd intrinsics segmentation-fault stdvector c++11

5
推荐指数
0
解决办法
791
查看次数

使用openmp + SIMD没有加速

我是Openmp的新手,现在尝试使用Openmp + SIMD内在函数来加速我的程序,但结果远非期望.

为了简化案例而不丢失太多重要信息,我写了一个简单的玩具示例:

#include <omp.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <sys/time.h>

#include "immintrin.h" // for SIMD intrinsics

int main() {
    int64_t size = 160000000;
    std::vector<int> src(size);

    // generating random src data
    for (int i = 0; i < size; ++i)
        src[i] = (rand() / (float)RAND_MAX) * size;

    // to store the final results, so size is the same as src
    std::vector<int> dst(size);

    // get pointers for vector load and store
    int * src_ptr = src.data();
    int * …
Run Code Online (Sandbox Code Playgroud)

c++ performance multithreading simd openmp

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