如何解决如何在 OpenMP 并行部分中 malloc/free?
我有几个嵌套的 for 循环,我在整个代码部分使用 #pragma omp parallel,在最外层循环使用 #pragma omp for。在循环中,我尝试使用双指针,然后在使用完毕后释放该双指针。
但是,我尝试了 2 种不同的方法,它们都出错了。在较新的版本中,我分配了大量空间,因此在 for 循环中,我创建了一个双指针,它只指向每次迭代的不同部分;然后,我最后释放了所有东西。在旧版本中,我只是在每次迭代的循环中分配和释放。我该如何解决这个问题?
较新版本:
#pragma omp parallel
{
double * vals_all = (double *) malloc(sizeof(double) * 4 * p * q);
#pragma omp for
for (int i = 0; i < p; i++) {
for (int j = 0; j < q; j++) {
__m256d calc = _mm256_setzero_pd();
for (int k = 0; k < r / 24 * 24; k += 24) {
// various SIMD operations changing calc values
}
double * vals = vals_all + 4 * i * j;
_mm256_storeu_pd(vals,calc);
for (int k = r / 24 * 24; k < r; k++) {
// various operations using vals
}
}
}
free(vals_all);
}
旧版本:
#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < p; i++) {
for (int j = 0; j < q; j++) {
__m256d calc = _mm256_setzero_pd();
for (int k = 0; k < r / 24 * 24; k += 24) {
// various SIMD operations changing calc values
}
double * vals = (double *) malloc(sizeof(double) * 4);
_mm256_storeu_pd(vals,calc);
for (int k = r / 24 * 24; k < r; k++) {
// various operations using vals
}
free(vals);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。