我正在尝试访问内核内的最后一个和下一个索引坐标。
例如:int idx = blockIdx.x * blockDim.x + threadIdx.x;
那么 pos[idx].x, pos[idx].y, pos[idx].z 将给出一个点的当前坐标。但无法访问其他两个。我正在尝试使用 CUDA 计算 GPU 级别中不断变化的三角形的法线。
你仍然可以做 idx+1, idx+2,GPU 可以访问所有的共享内存
为了获得最佳效率,您必须小心地将作业划分为块/线程等,以便附近点的内存位于同一核心上。
在 GPU 上计算法线的难易程度取决于网格拓扑。
使用三角形列表拓扑计算网格的法线很容易:每个三角形使用一个 GPU 线程。这会导致高度规则的读取和写入,并且适用于 CUDA 中任何有效的块和线程配置。不幸的是,三角形列表拓扑不是很有用(对于初学者来说,除非采用一些额外的处理,否则它将是平面阴影)。
计算具有三角形条形拓扑(常用)的网格的法线要困难得多。问题是顶点用于多个三角形,因此您必须通过组合多个三角形法线来为每个顶点法线累积一个 [加权] 平均值。每个三角形使用一个 GPU 线程意味着多个垂直规范将“同时”受到多个 GPU 线程的影响。或者,每个顶点使用一个 GPU 线程意味着需要引用该顶点的三角形列表,然后需要读取三角形(附加顶点对),以便可以计算顶点范数......这很困难,但并非不可能。
最后,如果您的模型使用索引顶点,这将施加额外的 [半随机] 查找,这可能会导致问题。这个问题可以通过空间分区来解决。