gpt4 book ai didi

c++ - 在 C++ 中使用 openmp 更新二维指针

转载 作者:行者123 更新时间:2023-11-30 05:24:09 25 4
gpt4 key购买 nike

代码 2 的问题在于,由于存在并行区域(这很明显),delE 无法更新。然而,代码 1 不符合标准,显示出不明确的结果。如果你们中的任何人能提供正确的解决方案来并行运行代码 1 或代码 2,我将不胜感激。

这里 grad_compute 返回一个 2d 指针,需要为每个并行循环存储或添加该指针。 norm_delE 和 delE 分别声明为 3d 和 2d 指针。

#pragma omp parallel for num_threads(8) 

for (int k = 0; k < no_of_sources; k++)
{
double** gnorm = grad_compute(/*parameters*/);

// code 1
/* for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++)
{
norm_delE[i][j][k] = gnorm[i][j]; } } */

// code 2
/* for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++)
{ delE[i][j] += gnorm[i][j]; } } */
}

如果您需要更多信息,我将不胜感激。

最佳答案

编辑和更新:对于代码 1,无需使用 gronm,grad_compute 的结果直接分配给 norm_delE,但 norm_delE 的维度应更改为 [no_of_sources] * [rows] * [cols]。

对于code2,因为多线程,同时写入delE数组,应该限制每个线程只更新部分行所以我们创建 2 个 omp for 循环,一个用于 code1,另一个用于 code2

此外,grad_compute 获取的内存应该由 free_memory 等函数释放,尽管对于内存管理,建议使用 std::vector 或 unique_ptr。

#pragma omp parallel  num_threads(8) 
{
//code 1
#pragma omp for
for (int k = 0; k < no_of_sources; k++)
{
norm_delEk[k] = grad_compute(/*parameters*/);
}
//code 2

#pragma omp for
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
for (int k = 0; k < no_of_sources; k++)
{
delE[i][j] += norm_delE[k][i][j];
}
}
}
}
//memory that acquired should be released
free_memory(norm_delE);

关于c++ - 在 C++ 中使用 openmp 更新二维指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38802767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com