C++ 如何用gcc编译SIMD代码

C++ 如何用gcc编译SIMD代码,c++,gcc,g++,simd,C++,Gcc,G++,Simd,我在SIMD中为矩阵乘法编写了这段代码,我可以在Visual Studio中编译它,但现在我需要在Ubuntu中使用gcc/g++编译它 我应该使用哪些命令来编译它?我需要对代码本身进行任何更改吗 #include <stdio.h> #include <stdlib.h> #include <xmmintrin.h> #include <iostream> #include <conio.h> #include <math.h&

我在SIMD中为矩阵乘法编写了这段代码,我可以在Visual Studio中编译它,但现在我需要在Ubuntu中使用gcc/g++编译它

我应该使用哪些命令来编译它?我需要对代码本身进行任何更改吗

#include <stdio.h>
#include <stdlib.h>
#include <xmmintrin.h>
#include <iostream>
#include <conio.h>
#include <math.h>
#include <ctime>

using namespace std;

#define MAX_NUM 1000
#define MAX_DIM 252

int main()
{
    int l = MAX_DIM, m = MAX_DIM, n = MAX_DIM;
    __declspec(align(16)) float a[MAX_DIM][MAX_DIM], b[MAX_DIM][MAX_DIM],c[MAX_DIM][MAX_DIM],d[MAX_DIM][MAX_DIM];

    srand((unsigned)time(0));

    for(int i = 0; i < l; ++i)
    {
        for(int j = 0; j < m; ++j)
        {
            a[i][j] = rand()%MAX_NUM;
        }
    }

    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
            b[i][j] = rand()%MAX_NUM;
        }
    }

    clock_t Time1 = clock();

    for(int i = 0; i < m; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
            d[i][j] = b[j][i];
        }
    }

    for(int i = 0; i < l; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
            __m128 *m3 = (__m128*)a[i];
            __m128 *m4 = (__m128*)d[j];
            float* res;
            c[i][j] = 0;
            for(int k = 0; k < m; k += 4)
            {
                __m128 m5 = _mm_mul_ps(*m3,*m4);
                res = (float*)&m5;
                c[i][j] += res[0]+res[1]+res[2]+res[3];
                m3++;
                m4++;
            }
        }
        //cout<<endl;
    }

    clock_t Time2 = clock();
    double TotalTime = ((double)Time2 - (double)Time1)/CLOCKS_PER_SEC;
    cout<<"Time taken by SIMD implmentation is "<<TotalTime<<"s\n";

    Time1 = clock();

    for(int i = 0; i < l; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
            c[i][j] = 0;
            for(int k = 0; k < m; k += 4)
            {
                c[i][j] += a[i][k] * b[k][j];
                c[i][j] += a[i][k+1] * b[k+1][j];
                c[i][j] += a[i][k+2] * b[k+2][j];
                c[i][j] += a[i][k+3] * b[k+3][j];

            }
        }
    }

    Time2 = clock();
    TotalTime = ((double)Time2 - (double)Time1)/CLOCKS_PER_SEC;
    cout<<"Time taken by normal implmentation is "<<TotalTime<<"s\n";

    getch();
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义最大数量1000
#定义最大尺寸252
int main()
{
int l=最大尺寸,m=最大尺寸,n=最大尺寸;
__declspec(align(16))浮点a[MAX_DIM][MAX_DIM],b[MAX_DIM][MAX_DIM],c[MAX_DIM][MAX_DIM],d[MAX_DIM][MAX_DIM];
srand((未签名)时间(0));
对于(int i=0;i//您是否需要启用SSE,例如

$ g++ -msse3 -O3 -Wall -lrt foo.cpp -o foo
您还需要更改:

declspec(align(16))
这是Windows特有的,适用于更便携的:

__attribute__ ((aligned(16)))

我的问题是如何用g++或gcc编译器在ubuntu中编译这段代码……我成功地用windows中的visual studio编译了这段代码,但不知道如何在ubuntu中编译。它会出现很多类似这样的错误//matrix_simd.cpp:25:error:“a”没有在这个范围内声明。但它成功编译,我能够在visual st中运行windows中的udio..这里我得到了这个错误我需要在这里添加任何标题吗???它被编译了,但它给出了一个警告///警告:“align”属性指令ignoredI可以发誓GCC也允许declspec语法,但我现在在移动设备上,所以我不能尝试它…另请参见C++11“alignas”关键字。@Nemo:yo你可能是对的,至少对gcc的某些版本来说——我也在移动设备上,现在无法检查——我知道Intel的ICC编译器支持这两种版本。