RISC-V 中的多维数组

问题描述 投票:0回答:1

我被分配在RISC-V中进行一些图像处理图像,并制作了以下C原型

#include <stdio.h>
#include <stdlib.h>

#define width 400
#define height 599
#define k_size 3

void meanFilter(unsigned char input[width][height], unsigned char output[width][height]) {
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            int sum = 0;
            for (int m = 0; m <= k_size-1; m++) {
                for (int n = 0; n <= k_size-1; n++) {
                    int row = i + m; int col = j + n; /*boundaries*/
                    if(row >= 0 && row < width && col >= 0 && col < height) {
                        sum += input[row][col];
                    }
                }
            }
            output[i][j] = sum / (k_size*k_size);
        }
    }
    puts("mean filter applied.");
}

我想我已经了解了几乎所有内容,除了如何访问

input
output
数组,例如
input[row][col]
output[i][j]
。我已将宽度和高度定义为单词,以及考虑到其 .GRAY 文件,整个图像应占用的空间 (
width
*
height
)。 预先感谢!

assembly multidimensional-array riscv
1个回答
0
投票

对于计算数组访问,RISC V 没有什么必然特定的 — 大多数现代计算机都使用字节寻址。

使用两个索引计算放在一起来访问二维矩形数组。

因此,首先计算

input[row]
产生中间地址,例如
aRow
,然后计算
aRow[col]

要计算任意

A[i]
的地址,您需要以下简单公式:
A + i * scale
— 其中,scale 是数组元素的字节数。对于字节数组,scale 为 1;而对于 32 位字数组,标度为 4。

对于结构体数组,标度是结构体的大小(以字节为单位);而对于矩形二维数组,有两个比例值,一个用于第一个数组索引,即列的大小,而对于第二个索引,则为单元格大小的比例值。

在计算

input[row]
时,您可以类似地计算
input + row * scale
,其中比例是整个列的字节数。该计算产生一个指向某个整列的开头的地址。第二次索引计算定位二维数组中单元格的起始地址。

一旦有了地址,您就可以根据需要取消引用(读或写)以访问给定的单元格。

某些处理器具有复杂的寻址模式,允许包含某些缩放而不是显式计算。但您不必使用它们,当您显式计算单元格时,调试起来会更容易,因为您可以看到该计算。

RISC V 没有任何复杂的寻址模式,因此您只需计算单元的完整地址并使用它间接访问单元内容。

© www.soinside.com 2019 - 2024. All rights reserved.