anonymous@RULINUX.NET~# Last login: 2024-12-26 00:27:21
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

Кэп: а ведь все процессоры разные!

Хотел написать себе функцию очистки экрана между рендерингом фреймов. Посчитал, что обычного memcpy мне мало, я ведь не хочу, чтобы он пачкал мне кэш. И вот, что я придумал:

c

#include <emmintrin.h>
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#define N 100000
#define M 20000

typedef uint32_t square[16] __attribute__((aligned(16)));

double gettime ()
{
    struct timeval tv;
    gettimeofday (&tv, NULL);
    return (double)tv.tv_sec + (0.000001 * (double)tv.tv_usec);
}

void fast_zero1 (square *ptr, size_t len)
{
    size_t i;
    __m128i zero = _mm_setzero_si128 ();

    for (i=0; i<len; i++)
    {
        _mm_stream_si128 ((void*)&(ptr[i][0]), zero);
        _mm_stream_si128 ((void*)&(ptr[i][4]),  zero);
        _mm_stream_si128 ((void*)&(ptr[i][8]),  zero);
        _mm_stream_si128 ((void*)&(ptr[i][12]), zero);
    }
}

void fast_zero2 (square *ptr, size_t len)
{
    size_t i;
    __m128i zero = _mm_setzero_si128 ();

    for (i=0; i<len; i++)
    {
        _mm_store_si128 ((void*)&(ptr[i][0]), zero);
        _mm_store_si128 ((void*)&(ptr[i][4]),  zero);
        _mm_store_si128 ((void*)&(ptr[i][8]),  zero);
        _mm_store_si128 ((void*)&(ptr[i][12]), zero);
    }
}

int main ()
{
    square *space = aligned_alloc (16, N*sizeof(square));
    int i;
    double time;

    time = gettime();
    for (i=0; i<M; i++)
    {
        memset (space, 0, N*sizeof(square));
    }
    time = gettime() - time;
    printf ("memset: %f\n", time);

    time = gettime();
    for (i=0; i<M; i++)
    {
        fast_zero1 (space, N);
    }
    time = gettime() - time;
    printf ("fast_zero1: %f\n", time);

    time = gettime();
    for (i=0; i<M; i++)
    {
        fast_zero2 (space, N);
    }
    time = gettime() - time;
    printf ("fast_zero2: %f\n", time);
   
    free (space);
    return 0;
}
 


Хочу пользоваться инструкциями, которые пишут мимо кеша (movntdq), группировать их для записи по 64 байта, чтобы был так называемый write combine, и скорость была не хуже, чем и обычного movdqa.

Вроде всё правильно сделал. Компиляем на 3 машинах одним и тем же clang 4.0.0 с флагом -O2

И что мы видим на разных архитектурах?

AMD Bulldozer:

memset: 12.772463
fast_zero1: 12.993790
fast_zero2: 12.628031
 
В принципе, ожидаемый результат

AMD Piledriver:

memset: 12.888442
fast_zero1: 14.814509
fast_zero2: 12.834234
 
Вопрос, почему вариант с movntdq такой тормозной тут?

И самая мякотка: Intel Atom Pineview

memset: 44.080462
fast_zero1: 21.228028
fast_zero2: 44.028512
 
Вариант в обход кэша, ВНЕЗАПНО, в 2 раза быстрее. Вот кто объяснит, ЧЯДНТ? Почему на Piledriver'е такая жопа? Алсо, результаты для других архитектур приветствуются, только по возможности используем тот же компилятор (или хотя бы указываем альтернативу).

Олсо, скоро куплю ризин, оценю его

Vasily(*) (2017-09-03 21:07:02)

Mozilla/5.0 (X11; FreeBSD amd64; rv:55.0) Gecko/20100101 Firefox/55.0

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: Кэп: а ведь все процессоры разные! от Vasily 2017-09-03 21:07:02
avatar
Скрыть

Re:Кэп: а ведь все процессоры разные!

интель G3220, компилил ggc-ой (gcc -O2 -msse2 main.c).

memset: 6.919018

fast_zero1: 7.359665

fast_zero2: 12.774364

Silvy(*)(2017-09-03 23:11:49)

Mozilla/5.0 (X11; Linux i686; rv:52.0) Gecko/20100101 Firefox/52.0
avatar
  • матерные выражения
Скрыть

Re:Кэп: а ведь все процессоры разные!

Эх, вангую, хуйню какую-то собрал gcc.

anonymous(*)(2017-09-04 07:34:02)

Mozilla/5.0 (X11; FreeBSD amd64; rv:55.0) Gecko/20100101 Firefox/55.0
avatar
  • матерные выражения
Скрыть

Re:Кэп: а ведь все процессоры разные!

На шланге такая же хуйня юудет. Я гарантирую это.

Silvy(*)(2017-09-04 10:39:36)

Mozilla/5.0 (X11; Linux i686; rv:52.0) Gecko/20100101 Firefox/52.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:Кэп: а ведь все процессоры разные! от Silvy 2017-09-04 10:39:36
avatar
Скрыть

Re:Кэп: а ведь все процессоры разные!

Не будет, инфа 100%

anonymous(*)(2017-09-04 13:28:44)

Mozilla/5.0 (Android 5.0; Mobile; rv:55.0) Gecko/55.0 Firefox/55.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:Кэп: а ведь все процессоры разные! от anonymous 2017-09-04 13:28:44
avatar
Скрыть

Re:Кэп: а ведь все процессоры разные!

Уже прогнал. Отличия незначительные.

Silvy(*)(2017-09-04 15:42:03)

Mozilla/5.0 (X11; Linux i686; rv:52.0) Gecko/20100101 Firefox/52.0
[#] [Добавить метку] [Редактировать] Ответ на: Кэп: а ведь все процессоры разные! от Vasily 2017-09-03 21:07:02
avatar
Скрыть

Re:Кэп: а ведь все процессоры разные!

> результаты для других архитектур приветствуются

Феном нужен?

bash

$ grep 'model na' /proc/cpuinfo
model name      : AMD Phenom(tm) II X4 945 Processor
model name      : AMD Phenom(tm) II X4 945 Processor
model name      : AMD Phenom(tm) II X4 945 Processor
model name      : AMD Phenom(tm) II X4 945 Processor

$ gcc --version
gcc (GCC) 7.1.1 20170622 (Red Hat 7.1.1-3)

$ clang --version
clang version 4.0.0 (tags/RELEASE_400/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix


$ gcc -O2 -msse2 msse2_test.c -o msse2_test

$ ./msse2_test
memset: 18.638798
fast_zero1: 16.737441
fast_zero2: 18.569926

$ clang -O2 -msse2 msse2_test.c -o msse2_test_clang

$ ./msse2_test_clang
memset: 19.404087
fast_zero1: 16.751405
fast_zero2: 19.114861

$ ./msse2_test_clang
memset: 18.794867
fast_zero1: 16.618179
fast_zero2: 18.869342

 

anonymous(*)(2017-09-05 01:25:52)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:Кэп: а ведь все процессоры разные! от anonymous 2017-09-05 01:25:52
avatar
Скрыть

Re:Кэп: а ведь все процессоры разные!

Вот, аналогично атому. stream вариант даже быстрее оказался. Эх, был бы какой-нибудь спец, чтобы это растолковать

Vasily(*)(2017-09-05 08:59:31)

Mozilla/5.0 (X11; FreeBSD) AppleWebKit/602.1 (KHTML, like Gecko) QupZilla/1.8.9 Version/9.0 Safari/602.1
[#] [Добавить метку] [Редактировать] Ответ на: Re:Кэп: а ведь все процессоры разные! от Vasily 2017-09-05 08:59:31
avatar
Скрыть

Re:Кэп: а ведь все процессоры разные!

bash


Установлено:
  clang.x86_64 4.0.1-4.fc26                                                                            

Выполнено!
[root@localhost ~]# выход
[vilfred@localhost devel]$ grep 'model na' /proc/cpuinfo
model name      : Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz
model name      : Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz
model name      : Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz
model name      : Intel(R) Core(TM) i5-3337U CPU @ 1.80GHz
[vilfred@localhost devel]$ gcc --version
gcc (GCC) 7.1.1 20170622 (Red Hat 7.1.1-3)
Copyright (C) 2017 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.

[vilfred@localhost devel]$ clang --version
clang version 4.0.1 (tags/RELEASE_401/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
[vilfred@localhost devel]$ gcc -O2 -msse2 x.c -o x
[vilfred@localhost devel]$ ./x
memset: 12.233878
fast_zero1: 14.054232
fast_zero2: 25.234491
[vilfred@localhost devel]$ clang -O2 -msse2 x.c -o x_clang
[vilfred@localhost devel]$ ./x_clang
memset: 11.982776
fast_zero1: 14.160926
fast_zero2: 11.924667
[vilfred@localhost devel]$ ./x_clang
memset: 13.354430
fast_zero1: 14.112488
fast_zero2: 13.005126
[vilfred@localhost devel]$

 

vilfred(*)(2017-09-05 15:17:49)
Отредактировано vilfred по причине "не указана"
Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
Этот тред читают 2 пользователя:
Анонимных: 2
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!