【发布时间】:2010-11-29 19:21:45
【问题描述】:
我正在做大量的矩阵运算,并希望利用 C99 的 restrict 指针限定符。
我想将我的矩阵设置为指向指针的指针,以便于下标,如下所示:
int **A = malloc (ncols * sizeof(int *));
A[0] = malloc (nrows * ncols * sizof(int));
for (int i=1; i < ncols; i++) {
A[i] = A[0] + i*nrows;
}
现在,对于矩阵乘法函数
void mmultiply ( int nrows, int ncols, int **Out, int **A, int **B);
我必须将参数的两个指针都限定为受限吗?这是有效的语法,但我很难确定 int *restrict *restrict 的行为是否与 int **restrict 不同。
那么,在适当限制指针的情况下,是否通过A[0][col*nrows + row] 访问元素未定义? (即,编译器是否会假设我仅通过A[col][row] 访问矩阵以获得row 的值,例如row < nrow)?还是我必须保持一致?
【问题讨论】:
-
非常感谢所有回答者!很遗憾我只能选择一个“正确”的答案——你们都帮助我思考了所涉及的问题。
-
十一年后,我想回到过去,对我以前的自己大喊大叫,因为我没有使用BLAS。好吧,好吧,当时还没有 OpenBLAS,但 the older netlib BLAS 确实存在。在任何情况下,优化矩阵乘法都不是您想要发现自己心血来潮做的事情!
标签: c pointers multidimensional-array c99 restrict-qualifier