彭于斌
彭于斌
这是你的仓库吗?看到这个仓库使用了OpenGL计算着色器,为什么说是单CPU的,可以参考一下我的:https://github.com/archibate/opengl_mpm
P2G这一步里的+=需要是atomic的吧?不然累计结果会不对,导致仿真结果爆炸。
你可以用chrono测一测每一步的时间,你应该会发现P2G这一步花的时间是最长的,因为P2G涉及了scatter操作,会出现多个线程同时访问同一个grid的情况,需要低效的atomic。 为了避免多线程竞争导致的性能损失,有两种方案: 1. 先把粒子按照[莫顿码](https://blog.csdn.net/cheche012345/article/details/127729403)排个序,排序后因为openmp会把值接近的i放在一个线程里执行,从而只有边缘存在多线程同时atomic访问同一个grid的情况。 2. 如果有4个cpu,那就把粒子按位置分成4块,分别在各自的区域里,那就不需要atomic了。
看到你把omp都注释了,是没加atomic炸了然后debug了半天是吧 ```cpp float mass_contrib = weight * particle_mass; grid[cell_index].mass += mass_contrib; grid[cell_index].vel += mass_contrib * (p.vel + Q); ``` 需要改成: ```cpp float mass_contrib = weight * particle_mass; #pragma omp atomic...
## 串行写法 例如,在串行编程中过滤出一个vector所有的偶数: ```cpp std::vector in = {1, 2, 3, 4}; std::vector out; for (size_t i = 0; i < in.size(); ++i) { if (in[i] % 2 == 0) out.push_back(in[i]);...
不要在cpu和gpu之间来回拷,全部统一放gpu上,只有当你需要导出结果时才拷回cpu。
_mm_set_ps(tempArray[gx][12] * tempArray[gy][13] * tempArray[gx][14], tempArray[gx][8] * tempArray[gy][9] * tempArray[gx][10], tempArray[gx][4] * tempArray[gy][5] * tempArray[gx][6], tempArray[gx][0] * tempArray[gy][1] * tempArray[gz][2_mm512_set_ps( 0.0, particles[i + 3].C[2][2], particles[i + 3].C[2][1], particles[i + 3].C[2][0],...
对不起!我的问题,将relaxed改成consume,应该没问题了。 https://github.com/parallel101/course/blob/73ce6ce23e87a32db620054da9f2e64d06b9c1f1/slides/atomic/list_teardown_pop.cpp#L72 
没有问题的,因为fetch_sub返回1,实际上说明引用计数已经是0了,fetch_sub返回的是“旧值”,相当于后置i--,知道吧。如果已经为0,那就没有任何其他人持有该指针,我是独占的,那随便delete。