小编And*_*And的帖子

使用 OpenMP 原子捕获操作获取粒子 3D 直方图并创建索引的竞争条件

我的完整代码中有一段代码:

\n
const unsigned int GL=8000000;\nconst int cuba=8;\nconst int cubn=cuba+cuba;\nconst int cub3=cubn*cubn*cubn;\nint Length[cub3];\nint Begin[cub3];\nint Counter[cub3];\nint MIndex[GL];\nstruct Particle{\n  int ix,jy,kz;\n  int ip;\n};\nParticle particles[GL];\nint GetIndex(const Particle & p){return (p.ix+cuba+cubn*(p.jy+cuba+cubn*(p.kz+cuba)));}    \n...\n#pragma omp parallel for\nfor(int i=0; i<cub3; ++i) Length[i]=Counter[i]=0;\n#pragma omp parallel for\nfor(int i=0; i<N; ++i)\n{\n  int ic=GetIndex(particles[i]);\n  #pragma omp atomic update\n  Length[ic]++;\n}\nBegin[0]=0;\n#pragma omp single\nfor(int i=1; i<cub3; ++i) Begin[i]=Begin[i-1]+Length[i-1];\n#pragma omp parallel for\nfor(int i=0; i<N; ++i)\n{\n  if(particles[i].ip==3)\n  {\n    int ic=GetIndex(particles[i]);\n    if(ic>cub3 || ic<0) printf("ic=%d out of range!\\n",ic);\n    int cnt=0;\n  #pragma omp atomic capture\n    cnt=Counter[ic]++;\n    MIndex[Begin[ic]+cnt]=i;\n  }\n}\n …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading atomic openmp histogram

3
推荐指数
1
解决办法
214
查看次数

三元运算符在递归中的奇怪行为

有一个正常工作的代码:

#include <iostream>

int sum_odd_digits(int n)
{
  if(n==0) return 0;
  else return (((n%2)!=0)?n%10:0) + sum_odd_digits(n/10);
}

int main(int argc, char ** argv)
{
  std::cout<<sum_odd_digits(25897641)<<std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是如果要去掉外括号,即替换

else return (((n%2)!=0)?n%10:0) + sum_odd_digits(n/10);
Run Code Online (Sandbox Code Playgroud)

else return ((n%2)!=0)?n%10:0 + sum_odd_digits(n/10);
Run Code Online (Sandbox Code Playgroud)

程序开始给出错误的输出结果,即开始不正确地工作。

为什么?这两条线有什么区别?

c++ recursion

1
推荐指数
1
解决办法
48
查看次数

标签 统计

c++ ×2

atomic ×1

histogram ×1

multithreading ×1

openmp ×1

recursion ×1