问题描述
您好,谢谢您浏览我的帖子。
这个问题是基于一个关于测试循环和矢量化依赖关系的作业的:
for(i=0;i<130;i++) {
a[ (130+1) * i + 13 ] = b[i] * c[i]; // s1
d[i] = a[ (130+1) * i + 13 * 130] + e; // s2
}
在此循环上使用Complete Banerjee测试表明,s1和s2之间的真实依赖关系已破坏,而s2和s1之间的反依赖关系却未被破坏。这是否意味着s2必须在s1之前执行?
目前,我认为将循环矢量化的一种方法是将循环分为两部分。
for(i=0;i<130;i++) {
a[ 131* i + 13 ] = b[i] * c[i]; // s1
}
for(i=0;i<130;i++) {
d[i] = a[ 131*i + 1690] + e; // s1
}
然后,展开两个循环(在此示例中,我选择的系数为3-可以是更大的数字吗?):
for(i=0;i<=129;i+=3) {
a [ 131 * i + 13 ] = b[i] * c[i];
a [ 131 * (i + 1) + 13 ] = b[i+1] * c[i+1];
a [ 131 * (i + 2) + 13 ] = b[i+2] * c[i+2];
}
i++;
a [ 131 * i + 13 ] = b[i] * c[i];
第二个循环上的类似操作:
for(i=0;i<=129;i+=3){
d[i] = a [ 131 * i + 1690] + e;
d[i+1] = a [ 131 * (i+1) + 1690] + e;
d[i+2] = a [ 131 * (i+2) + 1690] + e;
}
i++;
d[i] = a [ 131 * i + 1690] + e;
这些转换足以将这个循环向量化吗?是否有其他操作可以达到此目的(对于此特定循环或具有类似结构的其他循环)?
但是,恐怕通过这些转换,我并没有真正向量化该循环,而是并行化了-是否有用于向量化的独特转换?
仅需澄清一下,说明就不能特定于任何编程语言-我想知道矢量化和转换背后的概念。
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)