GCCのクロスコンパイラのサポートSVE ACLE

SVE技術AArch64の最近の研究では、現在のgccのバージョンはサポートしていないインターネット上で見つけることができることを発見し、SVE固有の方向通話を文書を見たときに、GCC 2020はgithubのが行う上で、gccの倉庫を参照してくださいサポートされることがわかりましたaarch64 / SVE-ACLE分岐の枝と呼ばれるがあります:

 

そして、クロスコンパイルしたコードにダウンロードし、その後でコンパイルするの、この枝テストプログラムを達成するためにSVE SVEの固有の方法、それは本当にコンパイルすることができます、あなたが実行できることを見出しました。コンパイル参照aarch64コンパイルされた命令を生成するためのクロスGCC(9.2) ここでプリコンパイル:リンク:https://pan.baidu.com/s/1utIj7f5kVCMYlE8BcBQ4DA抽出コード:ew2b

 

試験手順:

書式#include <stdlib.h>に含ま
する#include <stdio.hに> 
する#include <arm_sve.h> // スカラバージョン。
ボイドadd_arraysは(二重 * DST、制限二重 *のSRC、ダブル C、のconst int型N)を{
     ためint型 i = 0 ; iがNを<; iは++ 
        DST [I] = SRC [I] + C。
} // ベクトルバージョン 
ボイドvla_add_arrays(ダブル * DST、制限二重 *のSRC、ダブル C、のconst int型N)を{ 
    I int64_tの =



0 ; 

    svbool_t PG = svwhilelt_b64(I、(int64_tの)N)。
    一方、(svptest_any(svptrue_b64()、PG)){ 
        svfloat64_t VSRC = svld1(PG、SRC + I)。
        svfloat64_t VDST = svadd_x(PG、VSRC、C)。
        svst1(PG、DST + I、VDST)。

        I + = svcntd()。
        PG = svwhilelt_b64(I、(int64_tの)N)。
    } 
} 

// ベクトルバージョン 
ボイドvla_add_arrays_2(ダブル *のDST、ダブル * SRC、ダブル C、のconst int型N){
    以下のためにint型 i = 0 ; iがNを<; I + = svcntd()){ 
        svbool_t Pgの = svwhilelt_b64(I、N)。
        svfloat64_t VSRC = svld1(PG、およびSRC [I])。
        svfloat64_t VDST = svadd_x(PG、VSRC、C)。
        svst1(PG、およびDST [i]は、VDST)。
    } 
} 

int型メイン(ボイド){
     ダブル SRC [ 100 ]。
    ダブルC;
    二重 dst_serial [ 100 ]、dst_vla [ 100 ]、dst_vla2 [ 100 ]。
    以下のためのint型私= 0 ; I < 100 ; ++ I){ 
        SRC [I] =(ダブル)I /((二重)は、i + 1 )。
    } 

    C = SRC [ランド()%100 ]。

    add_arrays(dst_serial、SRC、C、100 ); 
    vla_add_arrays(dst_vla、SRC、C、100 ); 
    vla_add_arrays_2(dst_vla2、SRC、C、100 ); 

    以下のためにint型 i = 0 ; I < 100 ; ++ i)が{ 
        のprintf(" %F%F%F、%F、%F \ n "、dst_serial [i]は、dst_vla [i]は、dst_vla2 [i]は、SRC [I]、C)。
    } 
    戻り0 
}

 

コンパイルします。

 

CC = /ホーム/ pengdl /仕事/ SVE / CROSS_COMPILE / インストール / binに/ aarch64-linuxの-gnu- のgcc 
CFLAGS = -g -Wall -march = armv8。2 -a + SVE - O1 
LDFLAGS = - 静的

すべて:デモ

デモ:demo.o

%の.o:%のC 

クリーン:
    $(RM) * .oのデモ

 

 

テストの実行:

$ 作るきれい。作ります;
rm -f * .oのデモ
 /ホーム/ pengdl /仕事/ SVE / CROSS_COMPILE / インストール / binに/ aarch64-linuxの-gnu- のgcc -g -Wall -march = armv8。2 -a + SVE -O1 -c - O demo.o demo.c
 /ホーム/ pengdl /仕事/ SVE / CROSS_COMPILE / インストール / binに/ aarch64-linuxの-gnu- gccの --static demo.o - Oデモ
pengdl @ pengdl -dell:〜/仕事/ SVE / CROSS_COMPILE / teset 
$ qemuの -aarch64 ./ デモ
 0.988095  0.988095  0.9880950.0000000.988095 
1.488095 1.488095  1.4880950.5000000.988095 
1.654762  1.654762  1.6547620.6666670.988095 
1.738095  1.738095  1.7380950.7500000.988095 
1.788095  1.788095  1.7880950.8000000.988095 
1.821429  1.821429  1.8214290.8333330.988095 
1.845238  1.845238  1.8452380.8571430.988095 
1.863095  1.863095  1.8630950.8750000.988095 
1.876984  1.876984  1.8769840.8888890.988095 
1.888095  1.888095  1.8880950.9000000.988095 
... ...

 

仕上がり。

おすすめ

転載: www.cnblogs.com/pengdonglin137/p/11566864.html