在c++中使用openmp更新2d指针
updating 2d pointer using openmp in c++
代码2的问题是delE由于存在并行区域而无法更新(这是非常明显的(。然而,代码1没有达到要求,并且显示了不明确的结果。如果你们中的任何人能够提供正确的解决方案来并行运行代码1或代码2,我将不胜感激。
这里grad_compute返回一个2d指针,该指针需要为每个并行循环存储或添加。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,不需要使用直接分配给norm_delE的gnorm和grad_compute的结果,但norm_delE的维度应该更改为[no_of_sources]*[rows]*[cols]。
对于code2,因为多个线程同时写入delE数组,所以每个线程应该被限制为只更新一些行因此,我们为循环创建了两个omp,一个用于代码1,另一个用于编码2
此外,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++本机插件更新Vector3数组
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- cmake更新缓存的变量
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 更新到莫哈韦后出现cmath错误
- 四边形的 2D 旋转
- 打印第二列时的2d字符矢量打印空间
- OpenMP:并行更新数组总是需要减少数组吗
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 指针没有更新它在void函数内部指向的值
- 如何在c++中获取要更新的值
- 已修改的LinkedList未在文本文件本身中更新
- 2D 弹丸 - 更新我的 x 和 y 值
- Eigen3 或其他矩阵库 2D 矩阵是否可以通过共享内存从不同的进程更新
- 在c++中使用openmp更新2d指针