草庐IT

SIMD_WIDTH

全部标签

c++ - 从二阶导数计算的曲线的 SIMD 优化

这个问题真的很让人好奇。我正在将一个例程转换为SIMD指令(我对SIMD编程还很陌生),并且在使用以下代码时遇到了麻烦://args:uint32_tphase_current;uint32_tphase_increment;uint32_tphase_increment_step;for(inti=0;i问题:假设USEFUL_FUNC有一个SIMD实现,我只是想计算一个正确的vectorphase_current对于处理,处理phase_current的正确方法是什么?依赖于其先前的值(value)?反过来,一个函数式编程fold-like实现将同样有用,因为我试图了解如何提升数据

c++ - 如何优化 SIMD 转置函数(8x4 => 4x8)?

我需要使用AVX优化8x4和4x8浮点矩阵的转置。我使用AgnerFog的vectorclasslibrary.青色任务-构建BVH并求和最小值-最大值。转置用于每个循环的最后阶段(它们也通过多线程进行了优化,但任务确实很多)。代码现在看起来像:voidtranspose(registerVec4f(&fin)[8],registerVec8f(&mat)[4]){for(inti=0;i(Vec4i(0,8,16,24)+i,(float*)mat);}}需要优化的变体。如何为SIMD优化此功能?我最近用vector类编写了自己的转置变体(4x8和8x4)。版本1.0。voidtra

c++ - SIMD:实现 _mm256_max_epu64_ 和 _mm256_min_epu64_

我想问一个关于SIMD的问题。我的CPU中没有AVX512但想要一个_mm256_max_epu64.我们如何用AVX2实现这个功能?在这里,我尝试拥有我的微不足道的。也许我们可以将其作为讨论并加以改进。#defineSIMD_INLINEinline__attribute__((always_inline))SIMD_INLINE__m256i__my_mm256_max_epu64_(__m256ia,__m256ib){uint64_t*val_a=(uint64_t*)&a;uint64_t*val_b=(uint64_t*)&b;uint64_te[4];for(size_t

c++ - 使用 `__m256i` 中的值高效访问数组 - SIMD

关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭5年前。Improvethisquestion比方说,我有2个变量__m256i,名为rows和cols,它们里面的值是:rows:0,2,7,5,7,2,3,0cols:1,2,7,5,7,2,2,6现在,这些值代表8个点的x和y位置,因此,在这种情况下,我会有这些点:p0:[0,1],p1:[2,2],p2:[7,7],p3:[5,5]p4:[7,7],p5:[2,2],p6:[3,2],p7:[0,6]我还有一个名为lut的数组,它将具

c++ - openMP 的 SIMD 构造是否需要特定类型的硬件?

https://bisqwit.iki.fi/story/howto/openmp/Thesimdconstruct(OpenMP4.0+)OpenMP4.0addedexplicitSIMDparallelism(Single-Instruction,Multiple-Data).SIMDmeansthatmultiplecalculationswillbeperformedsimultaneouslybytheprocessor,usingspecialinstructionsthatperformthesamecalculationtomultiplevaluesatonce.T

c++ - 同时使用多个 SIMD 指令集的好处

我正在编写一个高度并行的多线程应用程序。我已经编写了一个SSE加速线程类。如果我要编写一个MMX加速线程类,然后同时运行两者(每个核心一个SSE线程和一个MMX线程),性能会显着提高吗?我认为此设置有助于隐藏内存延迟,但我想在开始投入时间之前先确定一下。 最佳答案 SSE和MMX指令集在CPU中共享同一组vector处理执行单元。因此,运行一个SSE线程和一个MMX线程时,每个线程将拥有相同的可用资源,就像运行两个SSE线程(或两个MMX线程)一样。唯一的区别是存在于SSE而不是MMX中的指令(因为SSE是MMX的扩展)。但在那种情

c++ - pragmas simd 和 ivdep vector 之间的区别总是?

我目前正在尝试对一个程序进行矢量化,但我观察到了一个奇怪的行为使用时似乎for循环被向量化了#pragmasimd(262):(col.3)remark:SIMDLOOPWASVECTORIZED.但是我用的时候没有#pragmavectoralways#pragmaivdep(262):(col.3)remark:loopwasnotvectorized:existenceofvectordependence.我一直以为两个句子做的向量化是一样的 最佳答案 pragmasimd强制循环矢量化,而不考虑成本或安全性。pragmave

c++ - 有没有更快的方法在 SIMD 上乘以 2(不使用乘法)?

旧float的一个技巧是从不乘以2,而是将操作数与自身相加,如2*a=a+a。今天,使用SSE/SSE2/SSSE3/NEON/...指令集等的旧技巧是否仍然可行?我的操作数是一个vector(比如,4个float,我想乘以2)。乘以3、4...怎么样? 最佳答案 我仍在努力寻找一个例子来说明这会在哪些方面有所作为。我的直觉是,如果延迟是一个问题,那么在某些情况下x+x会更好,但如果延迟不是问题并且只有吞吐量很重要,那么它可能会更糟。但首先让我们讨论一些硬件。让我坚持使用Intelx86处理器,因为这是我最了解的。让我们考虑以下几代

c++ - 在 C++ SIMD 中将带符号的短整数转换为 float

我有一个带符号的short数组,我想将其除以2048并得到一个float数组。我找到了SSE:convertshortintegertofloat允许将unsigned短裤转换为float,但我也想处理已签名的短裤。下面的代码有效,但仅适用于正短路。//Wewanttodividesomesignedshortby2048andgetafloat.constautofloatScale=_mm256_set1_ps(2048);short*shortsInput=/*valuesfromsomewhere*/;float*floatsOutput=/*initialized*/;__m

c++ - std::nth_element 的 SIMD 实现

我有一个算法可以在我的双核3GHzIntel处理器上平均运行250毫秒,我正在尝试优化它。目前,我有一个std::nth_element在std::vector上调用了大约6,000次的调用s在150到300个元素之间,平均耗时50毫秒。我花了一些时间优化我使用的比较器,它目前查找两个doubles来自vector并执行简单的比较。比较器运行时间的一小部分可以忽略不计std::nth_element.比较器的复制构造函数也很简单。因为这个调用目前占用了我算法20%的时间,而且大部分时间花在了nth_element的代码上。我没有写(即不是比较器),我想知道是否有人知道优化nth_ele