Új hozzászólás Aktív témák

  • joysefke

    veterán

    LOGOUT blog

    válasz pmonitor #9454 üzenetére

    Nem derül ki, hogy mit akarsz csinálni. És mi alapján választottad ki a bementő paramétereket.

    static unsafe void teszt_5(int[] source, int n)
    {
    fixed (int* pSource = source)
    {
    int* dest = stackalloc int[n];
    int* pSource_0 = pSource;
    int* pmax = pSource_0 + n;
    for (; pSource_0 < pmax; ++pSource_0, ++dest)
    {
    *dest = *pSource_0;
    }
    }
    }

    (1)
    bemegy egy tömb és egy int.

    (2)A stacken foglalsz egy int tömböt
    -ami nem tudja elhagyni a stacket
    -és nem lehet nagyobb mint a stack mérete (ráadásul a stackből foglalja a helyet aminek a metódus hívásakor már van egy a metódus számára ismeretlen mérete illetve a default stackméret futtatókörnyezettől is függ)

    (3)aztán feltöltöd az int[n] tömböt és
    (4)elfelejted

    Ha kézzel írnék tömbmásolásra egy UNSAFE metódust akkor bemenetként a már lefoglalt cél és forrástömb referenciáit vinném be aztán SIMD-del 32 byteonként másolnék (AVX register mérete).

    Amit te csinálsz ott egy int* pointert inkrementálsz és int méretben történik az adatmozgatás. (a mivel a ciklusok nem függenek az előzőektől ezért jó esetben 3-4 átlapolva történik meg)

    SIMD-del egyedül a memória sávszélessége szabna határt

    [ Szerkesztve ]

Új hozzászólás Aktív témák