Assembly CUDA GPU在有限元装配中的简化程序

Assembly CUDA GPU在有限元装配中的简化程序,assembly,cuda,element,Assembly,Cuda,Element,我们有一个非结构化四面体网格文件,包含以下格式: element-ID nod1 nod2 nod3 nod4 1 452 3434 322 9000 2 2322 837 6673 2323 . . . 300000 所以是一个C函数 calc() { for (int i=1;i<=no-of-elements;i++) { n1=nod1[i]; n2=nod2[i]; n3

我们有一个非结构化四面体网格文件,包含以下格式:

element-ID  nod1 nod2 nod3 nod4

1            452  3434 322 9000

2           2322   837 6673 2323

.
.
.

300000
所以是一个C函数

calc()
{

   for (int i=1;i<=no-of-elements;i++)
   {
      n1=nod1[i];
      n2=nod2[i];
      n3=nod3[i];
      n4=nod4[i];

      ax[n1] += some code;

      ax[n2] += some code;

      ax[n3] += some code;

      ax[n4] += some code;

   }

}
calc()
{

对于(int i=1;i而言,最好的解决方案是使用图着色将网格划分为子域。每种颜色都具有这样的特性,即其中的元素可以并行组装,而无需内存竞争。使用这种方法,您只需在网格中通过与颜色相同的次数即可完成组装


有很多关于并行有限元组装的文献,还有很多非常好的图划分代码(例如).Google scholar可能是学习该技术的最佳起点。

最好的解决方案是使用图形着色将网格划分为子域。每种颜色都具有这样的特性,即其中的元素可以并行组装,而无需内存争用。使用这种方法,您只需要通过网格一次s为了完成装配,有多种颜色


有很多关于并行有限元组装的文献,还有很多非常好的图划分代码(例如).Google scholar可能是学习这项技术的最佳起点。

目前的问题有点不清楚,但我想我知道你在暗示什么。你是在问如何在不借助原子学的情况下构建节点贡献的计算?恐怕我不理解这个问题-probab只是我不知道一些术语。什么是“四面体网格文件”?什么是“30万”?现在我看到一些用作数组索引的四倍体(导致非常糟糕的内存访问模式!).我们对这些指数有任何假设吗?@CygnusX1,但是是的,这是令人困惑的。目前的问题有点不清楚,但我想我知道你在暗示什么。你是在问如何在不诉诸原子学的情况下构建节点贡献的计算?恐怕我不理解这个问题-prob很有可能,我不知道一些术语。什么是“四面体网格文件”?什么是“3 lakh”?现在我看到一些用作数组索引的四倍体(导致非常糟糕的内存访问模式!)。我们对索引有任何假设吗?@CygnusX1,但是的,这令人困惑。+1我同意。在2D(三角形)的情况下元素我们使用聚集方法得到了很好的结果,其中每个元素的节点贡献被简单地计算并存储在第一个内核中,然后由第二个内核收集,该内核每个节点都有一个线程。虽然我不能保证OP的情况,但可能值得一试。@talonmies感谢您的回答我们将网格划分为多个部分,每个部分包含一个具有唯一节点n1、n2、n3、n4的分区,我们将分区大小传递给内核ie;如果分区大小为2048,则在具有512个线程限制的特斯拉上,我们执行
calc(d_ax,…);calc(d_ax,…);calc(d_ax,…);calc(d_ax,…);
问题是一次不能使用超过1个块。例如:calc(d_ax,…);//不工作calc(d_ax,…);//没有work@Krakesh:如果你能把你的问题表述为一个简明的编程问题,然后把它当作一个新问题来问。否则,仅仅根据你的评论,你怎么可能期望得到任何帮助?@Talonmes我发布了另一个问题+1我同意。在我们的例子中带2D(三角形)元素我们使用聚集方法得到了很好的结果,其中每个元素的节点贡献被简单地计算并存储在第一个内核中,然后由第二个内核收集,该内核每个节点都有一个线程。虽然我不能保证OP的情况,但可能值得一试。@talonmies感谢您的回答我们将网格划分为多个部分,每个部分包含一个具有唯一节点n1、n2、n3、n4的分区,我们将分区大小传递给内核ie;如果分区大小为2048,则在具有512个线程限制的特斯拉上,我们执行
calc(d_ax,…);calc(d_ax,…);calc(d_ax,…);calc(d_ax,…);
问题是一次不能使用超过1个块。例如:calc(d_ax,…);//不工作calc(d_ax,…);//没有work@Krakesh:如果你能把你的问题表述为一个简明的编程问题,然后把它当作一个新问题来问。否则,你怎么可能仅仅根据你的评论就指望得到任何帮助呢?@Talonmes我发布了另一个问题