Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6 7 8 9 10 .. 43   вперед  Ctrl
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 13348
Косяк из-за вывода. в C# UTF-8. Может кто подскажет как сделать на шарпе
printf("%c%c%c", (int) p.x, (int) p.y, (int) p.z);

не обязательно в консоль, можно в файл.

C# плохо знаю, сходу не нагуглил.
4 сен 15, 17:26    [18110280]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 39228
На сях - разрядность рубит. А в шарпах циклически заворачивает. Пробей ка вот так.

if (p.x > 255.0){  
  p.x = 255.0;
} else if (p.x < 0.0){
  p.x = 0.0; 
}
4 сен 15, 17:56    [18110525]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Изопропил
Member

Откуда:
Сообщений: 30987
Dima T
не обязательно в консоль, можно в файл.
            Stream outs = Console.OpenStandardOutput();
            byte[] tmp = Encoding.ASCII.GetBytes(string.Format("P6\n{0}\n{1}\n255\n", w, h));
            outs.Write( tmp,0,tmp.Length );

            outs.WriteByte((byte)x);
            outs.WriteByte((byte)y);
            outs.WriteByte((byte)z);
4 сен 15, 18:29    [18110671]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
eNose
Member

Откуда:
Сообщений: 183398
mayton
На сях - разрядность рубит. А в шарпах циклически заворачивает. Пробей ка вот так.

if (p.x > 255.0){  
  p.x = 255.0;
} else if (p.x < 0.0){
  p.x = 0.0; 
}
%c - char.
при переполнении будет остаток от деления на 255.
4 сен 15, 19:05    [18110827]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 13348
Изопропил, спасибо. Там проблема была именно с кодировками. Часть символов тупо заменялась на 0x3F т.е. "?".

mayton, не могу никак подцепиться к исходникам. Там похоже пробел в названии, может из-за этого
svn checkout --username=dmitriyt svn+ssh://dmitriyt@svn.code.sf.net/p/card-raytracer-bench/code/ card-raytracer-bench-code


Исходник C# в аттаче, Работает правильно. Правда не быстро. Закинь. Я потом еще поразбираюсь с svn`ом

К сообщению приложен файл (TestCPU1.cs - 4Kb) cкачать
4 сен 15, 19:33    [18110923]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 39228
По поводу CPU/Memory. Я могу пролететь в некоторых оценках касаемых ресурсов.
Чисто технически интенсивная нагрузка на умножения, деления и суммы векторов
(Vector) порождает поток аллокаций. Тоесть создавать условия чистого теста CPU

       public Vector sum(Vector r) {
            return new Vector(x + r.x, y + r.y, z + r.z);
        }

        public Vector mul(double r) {
            return new Vector(x * r, y * r, z * r);
        }

        public double mod(Vector r) {
            return x * r.x + y * r.y + z * r.z;
        }

        public Vector mulx(Vector r) {
            return new Vector(y * r.z - z * r.y, z * r.x - x * r.z, x * r.y - y * r.x);
        }


мне вряд-ли удасться для JVM. Возможно эти вектора будут удачно улетать из
Eden без релокаций в Survive. В этом случае перформанс будет на высоте.

Я подумаю можно-ли конструирование заменить на аналог прототипирования
или Flyweight шаблона.

Закоммитил черновой вариант java-raytrace.
4 сен 15, 19:36    [18110931]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 39228
Dima T, ты подходящий протокол выбрал. Попробуй эту ссылку.

svn checkout --username=...... https://svn.code.sf.net/p/card-raytracer-bench/code/ card-raytracer-bench-code
4 сен 15, 19:38    [18110939]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 13348
mayton
По поводу CPU/Memory. ...

Я же писал что первая стадия - портировать минимальной правкой синтаксиса, лишь бы работало. Стадия завершена. Есть код.
Дальше уже постепенный тюнинг. Правда я в C# чайник пока. Прочитал треть книжки, написал пару малюсеньких утилиток, вот и все что в шарпе я знаю/умею. Буду читать книжку, тюнинговать этот код. Может еще кто присоединится.
4 сен 15, 19:45    [18110953]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 39228
Dima T, меня интересует больше сведений о том как работает Ms.Net Memory Management.
Себе выкачал пакру книжек в pdf но еще нечитал.
4 сен 15, 19:49    [18110959]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 13348
Читаю "Дж.Рихтер CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#"
Можешь посвежее взять про 4.5. Хорошо пишет, без воды "для чайников", потому только треть и освоил. Я для себя понял что дальше без параллельной практики читать бесполезно. А практика как-то урывками получается.
4 сен 15, 20:04    [18111035]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 13348
Memory Management там разжеван от и до. Точнее он упор делает на производительность, но в целом это все в одну сторону.
4 сен 15, 20:08    [18111056]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Зимаргл
Guest
Прямо клуб анонимных линупсят (с) -
"А сегодня я не смог настроить это и это"

Я на параминутный взгляд не смог нормально паралелеизировать алгоритм.

Хотя внезапно, благодаря топику нашел, что в библиотеке предусмотрена компиляция векторных операций (т.е с массивами) в коды SSE
4 сен 15, 21:29    [18111319]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Изопропил
Member

Откуда:
Сообщений: 30987
Голодная лиса увидела на высокой беседке кисть винограда. Она хотела достать его, но не смогла. Тогда она удалилась, сказав: "Он еще зеленый". (с)
4 сен 15, 21:47    [18111373]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 39228
Dima T, так и не получилось с checkout?
4 сен 15, 21:59    [18111438]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
drsm
Member

Откуда:
Сообщений: 235
с целью вбить синтаксис в голову - заморочился

порт в тупую - 4:1

drsm@s400:~/work$ time iojs card-raytracer.js > olo1.ppm

real    1m52.741s
user    1m50.600s
sys     0m2.021s
drsm@s400:~/work$ time ./a.out > olo.ppm

real    0m28.904s
user    0m28.869s
sys     0m0.016s
drsm@s400:~/work$ grep 'model name' /proc/cpuinfo | head -n 1
model name      : Intel(R) Core(TM) i3-3217U CPU @ 1.80GHz


К сообщению приложен файл (card-raytracer.js - 2Kb) cкачать
5 сен 15, 05:15    [18112080]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
drsm
Member

Откуда:
Сообщений: 235
mayton
По поводу CPU/Memory. Я могу пролететь в некоторых оценках касаемых ресурсов.
Чисто технически интенсивная нагрузка на умножения, деления и суммы векторов
(Vector) порождает поток аллокаций. Тоесть создавать условия чистого теста CPU
       public Vector sum(Vector r) {
            return new Vector(x + r.x, y + r.y, z + r.z);
        }

        public Vector mul(double r) {
            return new Vector(x * r, y * r, z * r);
        }

        public double mod(Vector r) {
            return x * r.x + y * r.y + z * r.z;
        }

        public Vector mulx(Vector r) {
            return new Vector(y * r.z - z * r.y, z * r.x - x * r.z, x * r.y - y * r.x);
        }


мне вряд-ли удасться для JVM. Возможно эти вектора будут удачно улетать из
Eden без релокаций в Survive. В этом случае перформанс будет на высоте.

Я подумаю можно-ли конструирование заменить на аналог прототипирования
или Flyweight шаблона.

Закоммитил черновой вариант java-raytrace.


собрал статистику получилось как-то так:
{ constr: 4015341459,
  sum: 1941245464,
  mul: 202343137,
  mod: 3594553804,
  mulx: 2,
  inv: 42825396 }
5 сен 15, 06:44    [18112126]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4243
mayton,

добавь мне плиз ветку для fpc, kealon
5 сен 15, 07:54    [18112150]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 39228
Dima T
Исходник C# в аттаче, Работает правильно. Правда не быстро. Закинь. Я потом еще поразбираюсь с svn`ом

Закинул.
5 сен 15, 11:31    [18112381]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 39228
drsm, спасибо огромное за вклад. Закоммитил.

Revision: 8
Author: mayton
Date: Saturday, September 05, 2015 11:41:07 AM
Message:
Added JS-subproject
----
Added : /trunk/js
Added : /trunk/js/card-raytracer.js
5 сен 15, 11:43    [18112404]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 39228
kealon(Ruslan)
mayton,

добавь мне плиз ветку для fpc, kealon

Добавил в группу разработки. Пробуй.
5 сен 15, 11:45    [18112408]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 39228
Зимаргл
Я на параминутный взгляд не смог нормально паралелеизировать алгоритм.

Хотя внезапно, благодаря топику нашел, что в библиотеке предусмотрена компиляция векторных операций (т.е с массивами) в коды SSE

Это в каком компилляторе? VC, Gcc?
5 сен 15, 11:47    [18112414]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34417
mayton
Поднял репозитарий на сорсфорже. Пока пустой. Туда буду заливать эксперименты.

https://sourceforge.net/p/card-raytracer-bench/code/HEAD/tree/

Прошу прощения что не Git. С последним я работаю недавно и еще не могу
оперативно решать вопросы. Есть также некоторые идейные завтыки которые
меня ставят пока в состояние ступора (merge vs rebase к примеру).

Поэтому пока SVN

Вопрос ко всем. Какова должна быть структура? Как удобнее.


Структура должна быть простой и следующей (для вообще всех проектов).

<Путь к корню репозитория>/<ПРОЕКТ>/<trank> ....
<Путь к корню репозитория>/<ПРОЕКТ>/<brances> ....
<Путь к корню репозитория>/<ПРОЕКТ>/<tags> ....

всё остальное должно быть под trunk|branches|tags , то есть cpp, python и так далее.

Кстати , что-то доступа к репо нету....

ziv@xozzo:~/x$ svn co https://sourceforge.net/p/card-raytracer-bench/code/HEAD/tree/trunk card-raytracer
svn: E175011: Unable to connect to a repository at URL 'https://sourceforge.net/p/card-raytracer-bench/code/HEAD/tree/trunk'
svn: E175011: Repository moved temporarily to 'http://sourceforge.net/p/card-raytracer-bench/code/HEAD/tree/trunk'; please relocate
ziv@xozzo:~/x$
5 сен 15, 12:05    [18112452]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Зимаргл
Guest
mayton
Зимаргл
Я на параминутный взгляд не смог нормально паралелеизировать алгоритм.

Хотя внезапно, благодаря топику нашел, что в библиотеке предусмотрена компиляция векторных операций (т.е с массивами) в коды SSE

Это в каком компилляторе? VC, Gcc?

http://dlang.org

Кусочек кода из rtl
+
/***********************
 * Computes:
 *      a[] = b[] + value
 */

T[] _arraySliceExpAddSliceAssign_d(T[] a, T value, T[] b)
{
    enforceTypedArraysConformable("vector operation", a, b);

    //printf("_arraySliceExpAddSliceAssign_d()\n");
    auto aptr = a.ptr;
    auto aend = aptr + a.length;
    auto bptr = b.ptr;

    version (D_InlineAsm_X86)
    {
        // SSE2 version is 305% faster
        if (sse2 && a.length >= 8)
        {
            auto n = aptr + (a.length & ~7);

            // Array length greater than 8
            asm pure nothrow @nogc
            {
                mov EAX, bptr;
                mov ESI, aptr;
                mov EDI, n;
                movsd XMM4, value;
                shufpd XMM4, XMM4, 0;

                align 8;
            startsseloop:
                add ESI, 64;
                movupd XMM0, [EAX];
                movupd XMM1, [EAX+16];
                movupd XMM2, [EAX+32];
                movupd XMM3, [EAX+48];
                add EAX, 64;
                addpd XMM0, XMM4;
                addpd XMM1, XMM4;
                addpd XMM2, XMM4;
                addpd XMM3, XMM4;
                movupd [ESI+ 0-64], XMM0;
                movupd [ESI+16-64], XMM1;
                movupd [ESI+32-64], XMM2;
                movupd [ESI+48-64], XMM3;
                cmp ESI, EDI;
                jb startsseloop;

                mov aptr, ESI;
                mov bptr, EAX;
            }
        }
    }
    else version (D_InlineAsm_X86_64)
    {
        // All known X86_64 have SSE2
        if (a.length >= 8)
        {
            auto n = aptr + (a.length & ~7);

            // Array length greater than 8
            asm pure nothrow @nogc
            {
                mov RAX, bptr;
                mov RSI, aptr;
                mov RDI, n;
                movsd XMM4, value;
                shufpd XMM4, XMM4, 0;

                align 8;
            startsseloop:
                add RSI, 64;
                movupd XMM0, [RAX];
                movupd XMM1, [RAX+16];
                movupd XMM2, [RAX+32];
                movupd XMM3, [RAX+48];
                add RAX, 64;
                addpd XMM0, XMM4;
                addpd XMM1, XMM4;
                addpd XMM2, XMM4;
                addpd XMM3, XMM4;
                movupd [RSI+ 0-64], XMM0;
                movupd [RSI+16-64], XMM1;
                movupd [RSI+32-64], XMM2;
                movupd [RSI+48-64], XMM3;
                cmp RSI, RDI;
                jb startsseloop;

                mov aptr, RSI;
                mov bptr, RAX;
            }
        }
    }

    // Handle remainder
    while (aptr < aend)
        *aptr++ = *bptr++ + value;

    return a;
}

unittest
{
    debug(PRINTF) printf("_arraySliceExpAddSliceAssign_d unittest\n");
    for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
    {
        version (log) printf("    cpuid %d\n", cpuid);

        for (int j = 0; j < 2; j++)
        {
            const int dim = 67;
            T[] a = new T[dim + j];     // aligned on 16 byte boundary
            a = a[j .. dim + j];        // misalign for second iteration
            T[] b = new T[dim + j];
            b = b[j .. dim + j];
            T[] c = new T[dim + j];
            c = c[j .. dim + j];

            for (int i = 0; i < dim; i++)
            {   a[i] = cast(T)i;
                b[i] = cast(T)(i + 7);
                c[i] = cast(T)(i * 2);
            }

            c[] = a[] + 6;

            for (int i = 0; i < dim; i++)
            {
                if (c[i] != cast(T)(a[i] + 6))
                {
                    printf("[%d]: %g != %g + 6\n", i, c[i], a[i]);
                    assert(0);
                }
            }
        }
    }
}

/* ======================================================================== */
5 сен 15, 12:05    [18112454]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34417
mayton
Dima T
пропущено...

В жаве этого нет?

К сожалению да. Чтобы вернуть double by reference необходимо передать любой
объект-обёртку который этот double в себе содержит.


Блин, попробуй что ли Double ...
5 сен 15, 12:09    [18112463]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34417
kealon(Ruslan)
mayton,

добавь мне плиз ветку для fpc, kealon


а что такое fpc ? Free Pascal ?
5 сен 15, 12:10    [18112467]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6 7 8 9 10 .. 43   вперед  Ctrl
Все форумы / Программирование Ответить