我不确定问这个问题的最佳地点在哪里,但我目前正在使用 ARM 内部函数并遵循本指南:https ://developer.arm.com/documentation/102467/0100/Matrix-multiplication-example
但是,那里的代码是假设数组以列优先顺序存储的。我一直认为 C 数组是按行存储的。他们为什么会这样假设?
编辑:例如,如果不是这个:
void matrix_multiply_c(float32_t *A, float32_t *B, float32_t *C, uint32_t n, uint32_t m, uint32_t k) {
for (int i_idx=0; i_idx < n; i_idx++) {
for (int j_idx=0; j_idx < m; j_idx++) {
for (int k_idx=0; k_idx < k; k_idx++) {
C[n*j_idx + i_idx] += A[n*k_idx + i_idx]*B[k*j_idx + k_idx];
}
}
}
}
他们这样做了:
void matrix_multiply_c(float32_t *A, float32_t *B, float32_t *C, uint32_t n, uint32_t m, uint32_t k) {
for (int i_idx=0; i_idx < n; i_idx++) {
for (int k_idx=0; k_idx < k; k_idx++) {
for (int j_idx=0; j_idx < m; j_idx++) {
C[n*j_idx + i_idx] += A[n*k_idx + i_idx]*B[k*j_idx + k_idx];
}
}
}
}
由于按 C[0]、C[1]、C[2]、C[3] 的顺序访问 C 而不是按 C[0]、C[2]、C 的顺序访问 C 的空间局部性,代码将运行得更快[1]、C[3](其中 C[0]、C[1]、C[2]、C[3] 在内存中是连续的)。