Skip to content

有明显依赖顺序该怎么优化啊,救救孩子 #12

@muyuuuu

Description

@muyuuuu
#include <iostream>
#include <array>
#include <vector>
#include <random>

const int width = 1024;
const int height = 768;

template <typename T>
void RandomData(T &data) {
    std::mt19937 mt(20241101);
    std::uniform_int_distribution<int> int_dist(0, 255);
    for (int i = 0; i < data[0].size(); i++) {
        for (int j = 0; j < data.size(); j++) {
            data[i][j] = int_dist(mt);
        }
    }
}

int main() {
    std::array<std::array<uint8_t, height>, width> mask;
    std::array<std::array<uint8_t, height>, width> mask_errode;
    std::array<std::array<uint8_t, height>, width> disp;
    std::array<std::array<uint8_t, height>, width> dst;

    RandomData(mask);
    RandomData(mask_errode);
    RandomData(disp);
    RandomData(dst);

    std::vector<int> distance(width, 0);

    for (int i = 0; i < height; i++) {
        std::fill(distance.begin(), distance.end(), 0);
        int val = 0;
        int idx = 0;
        for (int j = 0; j < width; j++) {
            if ((!mask[i][j]) && (disp[i][j])) {
                val = disp[i][j];
                idx = j;
            }
            if ((250 < mask[i][j]) && (!mask_errode[i][j])) {
                dst[i][j] = val;
                if (0 != val) {
                    distance[j] = j - idx;
                }
            }
        }
        idx = 0;
        val = 0;
        for (int j = width - 1; j >= 0; j--) {
            if ((!mask[i][j]) && (disp[i][j])) {
                val = disp[i][j];
                idx = j;
            }
            if ((250 < mask[i][j]) && (!mask_errode[i][j])) {
                if (0 != val) {
                    if (0 != disp[i][j]) {
                        if (distance[j] > idx - j) {
                            dst[i][j] = val;
                        }
                    } else {
                        dst[i][j] = val;
                    }
                }
                if (dst[i][j] < disp[i][j]) {
                    dst[i][j] = disp[i][j];
                }
            }
        }
    }
    return 0;
}

补充:

  1. 我是安卓端,SIMD 是 Neon,估计和 SSE 差不多,感觉不太好写向量化
  2. cuda 也可以,或者有什么优化思路都可以

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions