我有一个非常简单的程序来乘以四个数字.它们每个都是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) 我需要一些关于如何在 Visual Studio 上使用 SSE 逻辑指令的帮助。基于MSDN 网站,
__m128 _mm_and_ps(__m128 a , __m128 b );
ANDPS
Run Code Online (Sandbox Code Playgroud)
可用于对操作数a和b执行逻辑与操作。但我无法弄清楚获取结果所需的确切步骤(内存加载和初始化、设置、存储等)。
具体来说,我想知道如何:
有人可以在一个例子中告诉我如何做到这一点吗?
谢谢!
我试图通过编写同样的霓虹内在函数来击败"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.
如果是,那么我的代码如何给出这些结果.是对还是错
我是 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) 由于具有 SIMD 优化,英特尔处理器可以更快地计算 SHA512。我想在 Ruby 中利用它。但是,SHA512 的实现不使用 SIMD https://github.com/ruby/ruby/blob/trunk/ext/digest/sha2/sha2.c吗?
有没有办法统一 SIMD 优化来计算 Ruby 中的 SHA512?
我使用以下内容来提取 的符号位__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该代码的目的是根据另一个向量的相应元素中的符号来更改向量元素的符号。
我有这个代码:
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,b和c.
但是,由于我操作__m128d(使用__declspec(align(16))),当我转换为指针时,是否保证对齐? …
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也是如此。
#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) 每当我尝试使用 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 …