powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Кусочно линейная интерполяция с ограничениями
15 сообщений из 65, страница 3 из 3
Кусочно линейная интерполяция с ограничениями
    #40090662
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
PetroNotC Sharp - ты слышал что нибудь про реализацию векторизации в JVM ?
я в этом нуб.
У меня хобби прикладной код и архитектура. То что "можно потрогать руками".
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090682
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Я пробовал векторное API на своем проекте, очень надеялся что будет летать, но.. никакого прироста не было :) Видать автовекторизация в моем случае и так хорошо срабатывала.

Как вариант еще переход на float вместо double (если это допустимо) может ускорить работу.

Да. Массив float - тоже хороший вариант. По крайней мере я не вижу доводов против.
Если это поможет векторизации.
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090711
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Линки по теме.

Вот джеб.
От 2018 года https://openjdk.java.net/jeps/338
ОТ 2021 года https://openjdk.java.net/jeps/414

Вот господин с прозаичной фамилией Иванов вещает нам свое видение

YouTube Video
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090767
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На 17 минуте Иванов показывает что детектирование факта перехода на векторизацию возможно для
отладночных сборок. Это меня немного не устраивает. Это как работать с Ораклом и не видеть
результата применения хинтов кроме как по времени отклика. А само по себе время в JVM
- достаточно сложно измеримо. Нужен хороший прогрев и большая выборка измерений чтоб
доказать что векторизация сработала.

Альтернативный вариант - наблюдать дамп ассемблера через -XX:+PrintAssembly и просто ожидать там
соотв. инструкций.

Вообще чем больше я смотрю тем больше вижу что векторизация это очень малая часть стека которая мне реально
нужно.
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090768
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя тренировочная база на сегодня.

Допустим я решил развалить RGB картинку в YUV представление и для наглядности изобразить ее в виде 4х
кадров - цветная и соотв 3 цветовых канала яркости и двух цвето-разностных. Как в телевидении Secam.

Интересующий меня фрагмент - пока крохотный и не занимает особого времени в вычислениях. (Пока).
Большую часть времени занимают чтение jpg файла и конверсия его в float представление.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
// 14-Aug, 2021 - mayton

public class YUVDecomposer {

    static Logger logger = LoggerFactory.getLogger(YUVDecomposer.class);

    public static void main(String[] args) throws IOException {
        // Convert from RGB to floating points quaternions
        String sourcePath = args[0];

        BufferedImage source = ImageIO.read(new FileInputStream(sourcePath));
        int W = source.getWidth();
        int H = source.getHeight();
        int PIXELS = W * H;

        logger.info("W = {}, H = {}, colorModel = {}", W, H, source.getColorModel());

        // 4 * sizeOf(float) = 4 * 32bit = 128bit. This is the same as single XMM register.

        float[] rgbSourceFloat = new float[PIXELS * 4];
        logger.info("rgbSourceFloat size = {}", rgbSourceFloat.length);

        // RGB ratios plane
        float[] yuvRatios = new float[PIXELS * 4];
        int i = 0;
        for (int j = 0; j < PIXELS; j++) {
            yuvRatios[i++] = (float) Constants.RK;
            yuvRatios[i++] = (float) Constants.GK;
            yuvRatios[i++] = (float) Constants.BK;
            yuvRatios[i++] = 0.0f; // Placeholder to be aligned
        }

        i = 0;
        int color = 0;
        for (int y = 0; y < H; y++) {
            for (int x = 0; x < W; x++) {
                color = source.getRGB(x, y);
                rgbSourceFloat[i++] = ImageUtils.getRPixel(color) / 255.0f; // Normalize to [0..1] range
                rgbSourceFloat[i++] = ImageUtils.getGPixel(color) / 255.0f;
                rgbSourceFloat[i++] = ImageUtils.getBPixel(color) / 255.0f;
                i++;
            }
        }

        // YUV-Plane
        float yval = 0.0f;
        float[] yPlane = new float[PIXELS];
        //float[] uPlane = new float[W * H];
        //float[] vPlane = new float[W * H];
        StopWatch renderYPlaneStopWatcher = StopWatch.createStarted();
        int j = 0;
        i = 0;
        // #pragma force jvm vectorization :)
        while (i < yuvRatios.length) {
            float yPlaneVal = 0.0f;
            // assumed mulps xmm0, xmm1 ... will be used
            yPlaneVal += yuvRatios[i] * rgbSourceFloat[i]; // Ri * RK
            i++;
            yPlaneVal += yuvRatios[i] * rgbSourceFloat[i]; // Gi * GK
            i++;
            yPlaneVal += yuvRatios[i] * rgbSourceFloat[i]; // Bi * Bk
            i++;
            yPlaneVal += yuvRatios[i] * rgbSourceFloat[i]; // Placeholder
            i++;
            yPlane[j] = yPlaneVal;
            j++;
        }
        renderYPlaneStopWatcher.stop();
        logger.info("renderYPlane : {} ms", renderYPlaneStopWatcher.getTime(TimeUnit.MILLISECONDS));
        // TODO: Render U, V
        
        // TODO: Generate U, V images

        // Export YUV planes as 4 split-screen images to be clear
        BufferedImage dest = new BufferedImage(W * 2, H * 2, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = (Graphics2D) dest.getGraphics();
        ImageObserver imageObserver = new YUVImageObserver(); // TODO: WTF? How to sync with fucken image observer?
        g2d.drawImage(source, 0, 0, imageObserver);
        sleep(5 * 1000);
        
        // TODO: Place Y, U, V images into 2,3,4x splits

        ImageIO.write(dest, "PNG", new FileOutputStream(FileUtils.trimExtension(sourcePath) + "-YUV-4x-split.png"));



    }
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090769
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тренировочная JDK (предпоследняя на данный момент).
Код: java
1.
2.
3.
4.
5.
6.
7.
$ javac -version
javac 16.0.2

$ java -version
openjdk version "16.0.2" 2021-07-20
OpenJDK Runtime Environment (build 16.0.2+7-67)
OpenJDK 64-Bit Server VM (build 16.0.2+7-67, mixed mode, sharing)
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090770
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
22 милисекунды на умножение двух плоскостей. Для 3х мегапиксельной картинки. Достаточно быстро пока
чтобы я вообще не парился этим вопросом.

Код: java
1.
2.
3.
[main] [INFO ] W = 3850, H = 2539, colorModel = ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@6483f5ae transparency = 1 has alpha = false isAlphaPre = false
[main] [INFO ] rgbSourceFloat size = 39100600
[main] [INFO ] renderYPlane : 22 ms
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090771
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Косячок.

Кто знаток Swing-графики? Вот эта операция по идее асинхронная. И ее надо блочить то тех пор
пока observer не получит событие что обновление завершено.

Код: java
1.
g2d.drawImage
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090772
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О. На 25 минуте Иванов показывает какие условия допустимы для unroll цикла. Переписал по аналогии.
Пускай шаг идет в 4 байта и offsets будут констанатами.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        for (i = 0; i < yuvRatios.length; i+=4) {
            float yPlaneVal = 0.0f;
            // assumed mulps xmm0, xmm1 ... will be used
            yPlaneVal += yuvRatios[i+0] * rgbSourceFloat[i+0]; // Ri * RK
            yPlaneVal += yuvRatios[i+1] * rgbSourceFloat[i+1]; // Gi * GK
            yPlaneVal += yuvRatios[i+2] * rgbSourceFloat[i+2]; // Bi * Bk
            yPlaneVal += yuvRatios[i+3] * rgbSourceFloat[i+3]; // Placeholder
            yPlane[j] = yPlaneVal;
            j++;
        }



Время пока не изменилось.
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090773
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Черт. Шаблон не множко не тот. Кто помнит в SSE есть такая инструкция чтоб взять 4 вещественных и перемножить на 4
других и просуммировать результирующий вектор?
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090777
maytonНа 17 минуте Иванов показывает что детектирование факта перехода на векторизацию возможно для
отладночных сборок.Это ты смотришь про автовекторизацию. А в 16ой появилась явная - там прям Java API для того чтоб самому писать векторизованный код. Только этот API в инкубаторе пока.

Но с такой простой математикой мне кажется у тебя должна была и автовекторизация включиться.
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090842
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пожалуй пока возьму паузу. Я кое-какие выводы для себя сделал. В. - это хорошая механика
но надо сначала делать прототип в обычном прямом виде и смотреть на В. лишь только после бенчмарков.
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090895
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забудьте про яву в контексте производительности. навсегда.

уже все опции выбраны, не полечило
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090910
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
забудьте про яву в контексте производительности. навсегда.

уже все опции выбраны, не полечило

Окей, теперь всё стало по своим местам.
...
Рейтинг: 0 / 0
Кусочно линейная интерполяция с ограничениями
    #40090913
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом приближении так. Пока без цвета. Только luma. Может я и дальше выкину расчет цвета из приближения.
Так узловых точек будет меньше.
...
Рейтинг: 0 / 0
15 сообщений из 65, страница 3 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Кусочно линейная интерполяция с ограничениями
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]