向量、gather/scatter 和稀疏数组
Vectors, gather/scatter and sparse arrays
根据计算机体系结构:定量方法,矢量处理器,包括像 Cray 这样的经典处理器和像 Nvidia 这样的现代处理器,提供 gather/scatter 来提高稀疏数组的性能,其中数组在内存中以稀疏形式存在,并在向量寄存器中聚集成密集形式。
在我看来,如果数组如此稀疏——非零元素的密度如此之低——以至于在内存中以密集形式表示它是低效的,那么以密集形式表示它也一定是低效的在向量寄存器中。例如,如果 99% 的条目为零,那么在内存中以密集形式表示它会浪费 98% 的内存……但会浪费 99% 的向量寄存器容量和算术运算!这已经足够高了,你最好只用标量运算来处理它。如果 75% 的条目为零,那么最好在内存中以密集形式表示它并避免非顺序 gather/scatter 操作。
使用 gather/scatter 的非零元素的典型密度是多少?在这种二元性有意义的最佳位置是否很常见 - 在这种情况下,哪些工作负载如此频繁地产生这种特定的密度范围 - 还是我还缺少其他东西?
正在更新评论以回答。
可以在 docs.nvidia.com/cuda/cusparse/index.html 找到回答问题的有用数据点。它建议对具有 >95% 零的矩阵使用 cuSparse 库。应该通过反复试验来确定您的应用程序和硬件的确切最佳位置,从稀疏表示切换到密集表示可以提供更好的性能。
没有专门的硬件来管理稀疏表示中数据的数学运算,转换为数据路径中的密集表示是执行数学运算的方法。虽然,在某种程度上,scatter/gather 是专用硬件,它延迟了稀疏->密集转换,直到我们真正需要它(即 ALU 需要带有操作数值的寄存器)。
根据计算机体系结构:定量方法,矢量处理器,包括像 Cray 这样的经典处理器和像 Nvidia 这样的现代处理器,提供 gather/scatter 来提高稀疏数组的性能,其中数组在内存中以稀疏形式存在,并在向量寄存器中聚集成密集形式。
在我看来,如果数组如此稀疏——非零元素的密度如此之低——以至于在内存中以密集形式表示它是低效的,那么以密集形式表示它也一定是低效的在向量寄存器中。例如,如果 99% 的条目为零,那么在内存中以密集形式表示它会浪费 98% 的内存……但会浪费 99% 的向量寄存器容量和算术运算!这已经足够高了,你最好只用标量运算来处理它。如果 75% 的条目为零,那么最好在内存中以密集形式表示它并避免非顺序 gather/scatter 操作。
使用 gather/scatter 的非零元素的典型密度是多少?在这种二元性有意义的最佳位置是否很常见 - 在这种情况下,哪些工作负载如此频繁地产生这种特定的密度范围 - 还是我还缺少其他东西?
正在更新评论以回答。
可以在 docs.nvidia.com/cuda/cusparse/index.html 找到回答问题的有用数据点。它建议对具有 >95% 零的矩阵使用 cuSparse 库。应该通过反复试验来确定您的应用程序和硬件的确切最佳位置,从稀疏表示切换到密集表示可以提供更好的性能。
没有专门的硬件来管理稀疏表示中数据的数学运算,转换为数据路径中的密集表示是执行数学运算的方法。虽然,在某种程度上,scatter/gather 是专用硬件,它延迟了稀疏->密集转换,直到我们真正需要它(即 ALU 需要带有操作数值的寄存器)。