Open easypickings opened 4 years ago
补充TODO
找助教确认的事情
A<16, 32>[i, j] = A<15, 32>[i, j] + B<16, 32>[i, k] * C<32, 32>[k, j];
// A[i][j]=A[i][j]+B[i][k]*B[k][j]
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++){
for(int k =0; k < l; k++){
A[i][j]+=B[i][k]*C[k][j];
}
// A[i][j]=B[i][k]*B[k][j]
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++){
A[i][j]=0;
for(int k =0; k < l; k++)
A[i][j]+=B[i][k]*C[k][j];
}
}
找助教确认的事情
- [x] 是否需要类型检查, 举个张量形状不一致的例子
A<16, 32>[i, j] = A<15, 32>[i, j] + B<16, 32>[i, k] * C<32, 32>[k, j];
- [x] 是否可以读run.h(函数签名那里可以偷懒一下吗?
- [x] 对于这两个例子的区别, 这样理解是否正确?
// A[i][j]=A[i][j]+B[i][k]*B[k][j] for(int i = 0; i < n; i++) for(int j = 0; j < m; j++){ for(int k =0; k < l; k++){ A[i][j]+=B[i][k]*C[k][j]; }
// A[i][j]=B[i][k]*B[k][j] for(int i = 0; i < n; i++) for(int j = 0; j < m; j++){ A[i][j]=0; for(int k =0; k < l; k++) A[i][j]+=B[i][k]*C[k][j]; } }
- [x] 和助教确认一下目前对爱因斯坦求和规范的理解是否正确(见上)
注意, 问过了助教, 助教的理解和我们的完全不一样, 这里不是严格的爱因斯坦求和规则 每一个statement一定是一个严格的loop nest, kernel就是最内层的语句
补充TODO
- [ ] 找个开源json库
形如
A[i,j] op B[j,k]
的Einstein求和(op
为*|/|//|%
)的计算:为每个不在LHS
中出现的变量j
生成一重For循环TODO:
r
的范围是否会依赖另一个变量p
?(e.g.p in [0,5), r in [0,3), p+r in [0,6)
)/ 是否会生成for r = 0 to p
的代码RHS
部分修改:引入新的Non-terminal分别表示RHS +|- RHS
和RHS *|/|//|% RHS
的情况A<5,5>[i,j]=D<5,5>[i,j]+B<5,7>[i,k]*C<7,5>[k,j]
的情况建议大家都安装docker跑通代码