1

我有一个由二维字符数组表示的图像,我需要对这个图像执行一些操作并将结果存储在另一个二维数组中,这些操作从计算相邻单元格的平均值到重新排序行不等。我可以做哪些优化来获得更好的性能?欢迎任何可能的技术(例如引用的位置、内联汇编……)

c在 linux x86_64 机器上使用

PS:我有原始彩色图像,每个像素由一组 RGB 值表示。

4

2 回答 2

2
  • 首先,为每个 rgb 三元组分配 4 个字节。
  • 每行的开头都有一个指针,然后可以通过指针交换来完成洗牌
  • 将您的 API 计划为void process_row(int *out_row, int *in_row, int *row_above, int *row_below);

  • 一些 RGB 计算可以与普通整数算术并行计算。

    • 例如 00rrrrrrrr 00bbbbbbbb 00gggggggg 适合单个 32 位整数。
      可以添加其中的 4 个而不会溢出,然后只需将结果右移 2 位
      并使用 0011111111 0011111111 0011111111 b 进行掩码
      (这当然需要对数据进行预处理和后处理)
    • 在64位处理器上打包00 rr 00 gg 00 bb 00 aa也是可行的办法
  • 可能更简单的方法是使用__sse 内在函数,从中只需一小步...
  • 内联汇编器
  • 还有一个包ORC,它实现了便携式 SIMD
于 2012-11-05T08:48:57.960 回答
0

您可以使用一维数组代替二维数组,这将大大提高缓存命中率。这将优化程序运行时间。

于 2012-11-14T15:18:32.260 回答