标签: sse

像“float[10][10]”这样初始化的数组是否已针对 SIMD/SSE 进行内存对齐?

我需要使用 SIMD/Intel SSE 来优化矩阵乘法。给出的示例代码如下所示:

*x = (float*)memalign(16, size * sizeof(float));
Run Code Online (Sandbox Code Playgroud)

但是,我使用的是 C++,而[found that][1]不是malloc(在执行 SIMD 之前),我应该使用new. 现在,我通过 SIMD/SSE 进一步优化,所以我需要对齐内存,所以问题是:我是否需要memalign/_aligned_malloc或者我的数组是否声明为

static float m1[SIZE][SIZE];
Run Code Online (Sandbox Code Playgroud)

已经对齐了吗?(SIZE是一个整数)

c++ sse simd

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

SSE 中的 ZeroMemory

我需要使用 SSE(首选 SSE2)进行简单的 ZeroMemory 实现有人可以帮忙吗?我正在通过 SO 和网络进行搜索,但没有找到直接答案。

optimization x86 assembly sse

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

SIMD 代码?

什么代码可以利用SIMD指令集的严格定义是什么?有什么可以并行运行计算的东西吗?

所以如果我有:

for(int i=0; i<100; i++){
    sum += array[i];
}
Run Code Online (Sandbox Code Playgroud)

这可以利用 SIMD,因为我们可以运行:

for(int i=0; i<100;i=i+4){
    sum0 += array[i];
    sum1 += array[i+1];
    sum2 += array[i+2];
    sum3 += array[i+3];
}

sum = sum0 + sum1 + sum2 + sum3;
Run Code Online (Sandbox Code Playgroud)

它必须是浮点类型,还是可以是双精度和整数?

c++ x86 sse simd avx

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

无法通过 gcc 中的“-march=native”或 Core2 芯片中的任何其他标志激活 SSE 指令集

我的机器是Core2微架构,我尝试编译一些针对SSE指令集的算术代码。我在网上和官方手册上搜索过,我认为我需要做的就是添加flag-march=native,因为我的芯片支持SSE。

\n\n

但是当我用来 gcc -march=native -Q --help=target -v检查该标志是否确实有效时,屏幕上显示的结果并不是我所期望的。例如\xef\xbc\x9a

\n\n
-msse                               [disabled]\n-msse2                              [disabled]\n-msse2avx                           [disabled]\n-msse3                              [disabled]\n-msse4                              [disabled]\n-msse4.1                            [disabled]\n-msse4.2                            [disabled]\n-msse4a                             [disabled]\n-msse5                              \n-msseregparm                        [disabled]\n-mssse3                             [disabled]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我发现所有 SSE(甚至 MMX)指令都被禁用。\n谁能告诉我原因以及如何解决它?\n非常感谢\xef\xbc\x81

\n

gcc sse simd mmx

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

使用 SIMD 内在函数进行高效的行列转换

我是 SIMD 编程的初学者。我想按如下方式处理我的数据:

考虑我有 4 个 simd 变量 ( __m128i),其数据如下:

__m128i a = {a1, a2, a3, a4}
__m128i b = {b1, b2, b3, b4}
__m128i c = {c1, c2, c3, c4}
__m128i d = {d1, d2, d3, d4}
Run Code Online (Sandbox Code Playgroud)

现在我想按如下方式初始化 Xi:

__m128i x1 = {a1, b1, c1, d1}
__m128i x2 = {a2, b2, c2, d2}
__m128i x3 = {a3, b3, c3, d3}
__m128i x4 = {a4, b4, c4, d4}
Run Code Online (Sandbox Code Playgroud)

有人可以建议我如何有效地做到这一点吗?

x86 sse simd matrix avx

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

SSE/SIMD 移位以一字节元素大小/粒度?

如您所知,SIMD SSE 中有以下移位指令:PSLL(WDQ) 和PSRL(WDQ)

没有PSLLB指令,那么我们如何移位 8 位值(单字节)的向量呢?

x86 assembly sse bit-shift

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

在 C++ 中使用 SSE2 SIMD 对两个数组求和的正确方法

让我们首先包括以下内容:

#include <vector>
#include <random>
using namespace std;
Run Code Online (Sandbox Code Playgroud)

现在,假设一个人有以下三个std:vector<float>

N = 1048576;
vector<float> a(N);
vector<float> b(N);
vector<float> c(N);

default_random_engine randomGenerator(time(0));
uniform_real_distribution<float> diceroll(0.0f, 1.0f);
for(int i-0; i<N; i++)
{
    a[i] = diceroll(randomGenerator);
    b[i] = diceroll(randomGenerator);
}
Run Code Online (Sandbox Code Playgroud)

现在,假设需要按a元素b求和并将结果存储在 中c,其标量形式如下所示:

for(int i=0; i<N; i++)
{
    c[i] = a[i] + b[i];
}
Run Code Online (Sandbox Code Playgroud)

上述代码的 SSE2 矢量化版本是什么,请记住输入是ab如上面定义的(即作为 的集合float)并且输出是c(也是 的集合float)?

经过大量研究后,我得出以下结论:

for(int i=0; i<N; i+=4)
{
    float a_toload[4] = …
Run Code Online (Sandbox Code Playgroud)

c++ arrays sse sum simd

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

分析 _mm_setzero_ps 和 {0.0f,0.0f,0.0f,0.0f}

编辑:正如 Cody Gray 在他的评论中指出的那样,禁用优化的分析完全是浪费时间。那么我应该如何进行这个测试呢?


微软在其XMVectorZero情况下定义了_XM_SSE_INTRINSICS_使用_mm_setzero_ps{0.0f,0.0f,0.0f,0.0f}不使用。我决定看看胜利有多大。因此,我在 Release x86 中使用了以下程序,并将配置属性>C/C++>优化>优化设置为Disabled (/Od)

constexpr __int64 loops = 1e9;
inline void fooSSE() {
    for (__int64 i = 0; i < loops; ++i) {
        XMVECTOR zero1 = _mm_setzero_ps();
        //XMVECTOR zero2 = _mm_setzero_ps();
        //XMVECTOR zero3 = _mm_setzero_ps();
        //XMVECTOR zero4 = _mm_setzero_ps();
    }
}
inline void fooNoIntrinsic() {
    for (__int64 i = 0; i < loops; ++i) {
        XMVECTOR zero1 = { 0.f,0.f,0.f,0.f };
        //XMVECTOR zero2 …
Run Code Online (Sandbox Code Playgroud)

c++ profiling sse visual-studio

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

AVX2 矢量化 256 位查找表(32 个无符号字符)

我是 AVX 内在函数(以及一般的 AVX)的新手,我正在尝试加速一些使用由 32 个无符号字符组成的 256 位查找表的代码。目前代码(带有虚拟数据)是这样写的:

unsigned char lookup_table[32] = { 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 };
unsigned char result[8];
unsigned char indices[8] = { 0, 4, 8, 12, 16, 20, 24, 28};
for(int i = 0; i < 8; i++)
{
    result[i] = lookup_table[indices[i]];
}
Run Code Online (Sandbox Code Playgroud)

效果很好,结果如下被放入“结果”中:

0, 4, 8, 12, …
Run Code Online (Sandbox Code Playgroud)

x86 sse simd avx avx2

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

SSE等矢量编程(SIMD)

我对 SSE 编程完全陌生,但拥有 Intel Core i7 处理器。

基本上,我想一次取 4 个 32 位无符号整数并将它们全部立方(求 3 次方)。据我了解,SSE 及其后续产品的 SIMD 功能使这成为可能,但我到底该如何去做呢?最好用 C 语言,但如果需要的话我可以管理汇编。

编辑以明确我的最终目标:

然后,我想将所有立方体加在一起得出一个数字。

背景:我只是想使用 SSE 来优化确定一个数字是否是阿姆斯特朗数字(一个三位数,其每个数字的立方之和与数字本身相同)。一个例子是153。除了暴力之外似乎没有其他办法可以做到这一点。这些是自恋数字的子集,其所有数字的总和乘以十进制数字的长度次方等于数字本身。希望我最终能将其扩展得更加灵活,一开始我只是做阿姆斯特朗的数字。正如您可能想象的那样,这个问题出现在另一个网站上,我们中的一些人正在尝试对其进行优化。通过采纳你的想法和我自己的研究,我想出了这个代码:

#include <stdio.h>
#include <smmintrin.h>  // SSE 4.1

__m128i vcube(const __m128i v)
{
    return _mm_mullo_epi32(v, _mm_mullo_epi32(v, v));
}


int main(int argc, const char * argv[]) {
    for (unsigned int i = 1; i <= 500; i++) {
        unsigned int firstDigit = i / 100;
        unsigned int secondDigit = (i - firstDigit * 100) / 10;
        unsigned int …
Run Code Online (Sandbox Code Playgroud)

c x86 sse simd

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

标签 统计

sse ×10

simd ×7

x86 ×6

c++ ×4

avx ×3

assembly ×2

arrays ×1

avx2 ×1

bit-shift ×1

c ×1

gcc ×1

matrix ×1

mmx ×1

optimization ×1

profiling ×1

sum ×1

visual-studio ×1