我正在为单身汉的项目探索GPU上的等值面算法(特别是仅关注二进制输入/输出体素数据,而不是实值字段)。因此,我有一个良好的旧行军多维数据集的CPU实现,并在OpenFrameworks中运行,现在处于尝试将其移植到GLSL计算着色器的阶段,并在下潜之前考虑了陷阱。我只写了vert和frag着色器在此之前,这对我来说都是全新的。
我的第一个问题是如何有效地在工作组中的数十个或数百个线程中使用查找表?我了解GPU可以为不同的任务提供不同类型的内存,但不能完全确定每个GPU的工作方式或使用哪种类型。
Paul Bourke的经典copypasta表是256 * 16的数组,因此,如果使用标量字节类型,则可以将其打包为4kb纹理或SSBO。
问题是,如何阻止不同的线程相互跳闸?每个工作组中的许多多维数据集都可能具有相同的配置,因此尝试同时访问缓冲区中的相同位置。有解决方法或优化来解决吗?
如果它是只读查询表,则可以只使用缓冲区/纹理。您可以将其打包为一种正常的纹理格式,也可以使用DX11 / OpenGL的某些较新功能来具有自定义格式。DX11区域中的无人机,或OpenGL区域中的纹理/ shader_image_load_store。
—
RichieSams,2015年
此外,请看一下此演示文稿:cvg.ethz.ch/teaching/2011spring/gpgpu/cuda_memory.pdf适用于CUDA,但它应该使您更好地了解底层硬件的状况
—
RichieSams 2015年
并不是一个完整的答案,但您使用的内存量越少越好,因为它更可能适合缓存,并且缓存未命中的次数更少。如果您具有可插值,例如将曲线上的点烘焙为纹理,则可以将其检查为一种以较少的内存获得高质量曲线查找表的方法:blog.demofox.org/2016/02/22/…
—
艾伦·沃尔夫