循环矢量化-测试和转换

问题描述

您好,谢谢您浏览我的帖子。

这个问题是基于一个关于测试循环和矢量化依赖关系的作业的:

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 (将#修改为@)