c++ - 重写代码以去除循环携带的依赖
问题描述
我正在尝试重写这个外部for
循环以允许多个线程并行执行迭代。实际上,现在我只想要两个线程来计算它,尽管更通用的解决方案是理想的。问题是有一个循环携带的依赖:与本次迭代的值一起nval[j]
被添加到先前的值中。nval[j]
avval
void loop_func(Arr* a, int blen, double* nval) {
// an Arr is a struct of an array and len field
assert(a->len < blen);
long long int i = 0, j = 0, jlo = 0, jhi = 0;
double avval = 0.0;
for (i = 0; i < blen; i++)
nval[i] = 0.0;
const double quot = static_cast<double>(blen) / static_cast<double>(a->len);
for (auto i = 1; i < a->len - 1; i++) {
j_lower = (int)(0.5 * (2 * i - 1) * quot);
j_upper = (int)(0.5 * (2 * i + 1) * quot);
printf("a->val index: %lld\t\tnval index: %lld-%lld\n", i, j_lower, j_upper);
avval = a->val[i] / (j_upper - j_lower + 1);
for (j = j_lower; j <= j_upper; j++) {
nval[j] += avval;
}
}
}
为方便起见,我打印了一些通过printf
上面打印的细节。
a->val index: 1 nval index: 1-3
a->val index: 2 nval index: 3-5
a->val index: 3 nval index: 5-7
a->val index: 4 nval index: 7-9
a->val index: 5 nval index: 9-11
a->val index: 6 nval index: 11-13
理想情况下,我希望线程 1 处理 a->val 索引 1-3,线程 2 处理 a-val 索引 4-6。
问题 1:任何人都可以描述一个可以消除这种依赖关系的代码转换吗?
问题 2:是否有 C/C++ 工具可以做到这一点?也许是用 LLVM 构建的?我可能会遇到很多不同的情况,比如我需要做一些并行执行。同样,如果可以应用通用技术来删除这种循环携带的依赖项,我想更普遍地了解这一点。
解决方案
推荐阅读
- laravel - Vue js 和 Laravel 中的多图像上传器
- javascript - React 使用 webpack 在自定义路径下构建 .js 文件
- java - 文件的处理:字节数组和维度
- javascript - 当我们通过 chrome android 通知暂停音频时,howler.js 未检测到暂停事件
- rust - 无法在 init 中使用 lateinit 变量
- python - 如果熊猫数据框中的年份彼此相邻,如何按组选择行?
- php - MYSQL查询搜索名称并忽略其中的元音
- python - 如何在 Python 中执行 S4 类方法(使用 rpy2)?
- c++ - 从控制台屏幕c ++中删除星号
- python - Decode and access mbox file with mbox Python mdule