标签: simd

SSE:_mm_mul_ps不会正确地将10001与10001相乘,但10000可以正常工作10000

我有一个非常简单的程序来乘以四个数字.它们每个都是10000时工作正常,但如果我将它们改为10001则没有.结果是一个.

gcc -msse2 main_sse.c -o sse在AMD Opteron和Intel Xeon上编译了这个程序,并在两台机器上得到了相同的结果.

我将不胜感激任何帮助.在这个主题上无法在线找到任何内容.

#include <stdlib.h>
#include <stdio.h>
#include <xmmintrin.h>

int main(){

    float x[4], y[4], temp[4]; int i;  __m128 X, Y, result;

    for(i=0; i < 4; i++) { x[i] = 10000; y[i] = 10000; }

    X = _mm_load_ps(&x[0]);  Y = _mm_load_ps(&y[0]);  
    result = _mm_mul_ps(X,Y); _mm_store_ps(&temp[0], result);

    for(i=0; i < 4; i++) { x[i] = 10001; y[i] = 10001; }

    X = _mm_load_ps(&x[0]);  Y = _mm_load_ps(&y[0]);  
    result = _mm_mul_ps(X,Y); _mm_store_ps(&temp[0], result);
}
Run Code Online (Sandbox Code Playgroud)

x86 sse simd

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

如何使用SSE逻辑指令

我需要一些关于如何在 Visual Studio 上使用 SSE 逻辑指令的帮助。基于MSDN 网站

__m128 _mm_and_ps(__m128 a , __m128 b );
ANDPS
Run Code Online (Sandbox Code Playgroud)

可用于对操作数ab执行逻辑与操作。但我无法弄清楚获取结果所需的确切步骤(内存加载和初始化、设置、存储等)。

具体来说,我想知道如何:

  1. 执行操作,
  2. 返回结果,然后
  3. 获得结果的大小(有效位数)。

有人可以在一个例子中告诉我如何做到这一点吗?

谢谢!

x86 sse simd

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

用neon intrinsics替换memcpy

我试图通过编写同样的霓虹内在函数来击败"memcpy"函数.以下是我的逻辑:

uint8_t* m_input;  //Size as 400 x300
uint8_t* m_output; //Size as 400 x300
//not mentioning the complete code base for memory creat 

memcpy(m_output, m_input, sizeof(m_output[0]) * 300* 400);
Run Code Online (Sandbox Code Playgroud)

氖:

int32_t ht_index,wd_index;
uint8x16_t vector8x16_image;

for(int32_t htI =0;htI < m_roiHeight;htI++){
    ht_index = htI * m_roiWidth ;

    for(int32_t wdI = 0;wdI < m_roiWidth;wdI+=16){
        wd_index = ht_index + wdI;
        vector8x16_image = vld1q_u8(m_input);

        vst1q_u8(&m_output[wd_index],vector8x16_image);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在imx6硬件上多次验证了这些结果.

结果:

Memcpy :0.039 milisec
neon memcpy: 0.02841 milisec
Run Code Online (Sandbox Code Playgroud)

我读了一些没有预先说明的说明,我们不能打败MEMCPY.

如果是,那么我的代码如何给出这些结果.是对还是错

arm simd neon cortex-a

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

没有编译器优化的 SSE 内在函数

我是 SSE 内在函数的新手,并尝试通过它来优化我的代码。这是我的程序,用于计算等于给定值的数组元素。

我将代码更改为 SSE 版本,但速度几乎没有改变。我想知道我是否以错误的方式使用SSE......

此代码用于不允许我们启用编译器优化选项的分配。

无 SSE 版本:

int get_freq(const float* matrix, float value) {

    int freq = 0;

    for (ssize_t i = start; i < end; i++) {
        if (fabsf(matrix[i] - value) <= FLT_EPSILON) {
            freq++;
        }
    }

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

上交所版本:

#include <immintrin.h>
#include <math.h>
#include <float.h>

#define GETLOAD(n) __m128 load##n = _mm_load_ps(&matrix[i + 4 * n])
#define GETEQU(n) __m128 check##n = _mm_and_ps(_mm_cmpeq_ps(load##n, value), and_value)
#define GETCOUNT(n) count = _mm_add_ps(count, check##n)

    int get_freq(const float* matrix, float …
Run Code Online (Sandbox Code Playgroud)

c sse simd compiler-optimization

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

Ruby 中的 SHA512 和 SIMD

由于具有 SIMD 优化,英特尔处理器可以更快地计算 SHA512。我想在 Ruby 中利用它。但是,SHA512 的实现不使用 SIMD https://github.com/ruby/ruby/blob/trunk/ext/digest/sha2/sha2.c吗?

有没有办法统一 SIMD 优化来计算 Ruby 中的 SHA512?

ruby simd sha512

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

AVX/SSE 将浮点符号掩码转换为 __m128i

我使用以下内容来提取 的符号位__mm128

const int sign_mask = _mm_movemask_ps(a);
Run Code Online (Sandbox Code Playgroud)

我现在想使用以下内容来混合两个向量:

v_add = _mm_blendv_ps(a, v_add_neg, _mm_castsi128_ps(v_mask));
Run Code Online (Sandbox Code Playgroud)

v_mask需要来自sign_mask但我找不到执行此操作的内在函数。

a该代码的目的是根据另一个向量的相应元素中的符号来更改向量元素的符号。

c sse simd intrinsics avx

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

是不是__m128d本地对齐?

我有这个代码:

double a[bufferSize];
double b[voiceSize][bufferSize];
double c[voiceSize][bufferSize];

...

inline void AddIntrinsics(int voiceIndex, int blockSize) {
    // assuming blockSize / 2 == 0 and voiceIndex is within the range
    int iters = blockSize / 2;
    __m128d *pA = (__m128d*)a;
    __m128d *pB = (__m128d*)b[voiceIndex];
    double *pC = c[voiceIndex];

    for (int i = 0; i < iters; i++, pA++, pB++, pC += 2) {
        _mm_store_pd(pC, _mm_add_pd(*pA, *pB));
    }   
}
Run Code Online (Sandbox Code Playgroud)

但是,"有时",它提高访问内存冲突,我认为它是由于缺少我的3个数组的内存对齐的a,bc.

但是,由于我操作__m128d(使用__declspec(align(16))),当我转换为指针时,是否保证对齐? …

c++ sse simd memory-alignment intrinsics

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

使用 AVX 内在函数对 __m512i 中的 8 位整数求和

AVX512 为我们提供了对__mm512向量中所有单元格求和的内在函数。然而,他们的一些同行却不见了:还没有_mm512_reduce_add_epi8

_mm512_reduce_add_ps     //horizontal sum of 16 floats
_mm512_reduce_add_pd     //horizontal sum of 8 doubles
_mm512_reduce_add_epi32  //horizontal sum of 16 32-bit integers
_mm512_reduce_add_epi64  //horizontal sum of 8 64-bit integers
Run Code Online (Sandbox Code Playgroud)

基本上,我需要MAGIC在以下代码段中实现。

__m512i all_ones = _mm512_set1_epi16(1);
short sum_of_ones = MAGIC(all_ones);
/* now sum_of_ones contains 32, the sum of 32 ones. */
Run Code Online (Sandbox Code Playgroud)

最明显的方法是使用_mm512_storeu_epi8数组元素并将其相加,但这会很慢,而且可能会使缓存无效。我想存在一种更快的方法。

实施的奖励积分_mm512_reduce_add_epi16也是如此。

c x86 simd intrinsics avx

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

_mm256_load_ps 在调试模式下导致 google/benchmark 出现分段错误

  • 以下代码可以在发布和调试模式下运行。
#include <immintrin.h>

constexpr int n_batch = 10240;
constexpr int n = n_batch * 8;
#pragma pack(32)
float a[n];
float b[n];
float c[n];
#pragma pack()

int main() {
    for(int i = 0; i < n; ++i)
        c[i] = a[i] * b[i];

    for(int i = 0; i < n; i += 4) {
        __m128 av = _mm_load_ps(a + i);
        __m128 bv = _mm_load_ps(b + i);
        __m128 cv = _mm_mul_ps(av, bv);
        _mm_store_ps(c + i, cv);
    }

    for(int i = 0; i < …
Run Code Online (Sandbox Code Playgroud)

c++ simd segmentation-fault avx google-benchmark

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

错误:使用未声明的标识符“vmaxq_f16”

每当我尝试使用 NEON 16 位浮点内在函数时都会收到此错误。我没有遇到其他数据类型内在函数的任何问题。

是否可以在 Android 上使用 NEON 16 位浮点内在函数?

我的代码:

#include <jni.h>
#include <arm_fp16.h>
#include <arm_neon.h>

void useSIMD_f16() {
    float16_t zero = 0;
    float16x8_t zero_f16x8 = vld1q_dup_f16(&zero);
    float16_t one = 1;
    float16x8_t one_f16x8 = vld1q_dup_f16(&one);
    float16x8_t max = vmaxq_f16(zero_f16x8, one_f16x8);
}
Run Code Online (Sandbox Code Playgroud)

错误:

任务“:app:externalNativeBuildDebug”的执行失败。构建命令失败。使用参数 {-C /home/raed/AndroidStudioProjects/SIMD/app/.cxx/cmake/debug/armeabi-v7a native- 执行进程 /home/raed/Android/Sdk/cmake/3.10.2.4988404/bin/ninja 时出错lib} ninja:进入目录`/home/raed/AndroidStudioProjects/SIMD/app/.cxx/cmake/debug/armeabi-v7a' [1/2] 构建CXX对象CMakeFiles/native-lib.dir/native-lib.cpp .o 失败:CMakeFiles/native-lib.dir/native-lib.cpp.o /home/raed/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target =armv7-none-linux-androideabi23 --gcc-toolchain=/home/raed/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/raed/Android/Sdk /ndk/22.1。7171670/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -MD -MT CMakeFiles/native-lib.dir/native-lib.cpp.o …

android simd intrinsics neon android-ndk

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