我是一个相当新的 cuda 用户。我正在练习我的第一个 cuda 应用程序,尝试使用 GPU(GTX 670) 加速 kmeans 算法。
简而言之,每个线程都在一个点上工作,该点与所有聚类中心进行比较,并将一个点分配给具有最小距离的中心(内核代码可以在下面看到,并附有注释)。
根据 Nsight Visual Studio,我的占用率为 99.61%(1024 个块,每个块 1024 个线程),流式多处理器活动为 99.34%,扭曲问题效率为 79.98%,无共享内存库冲突,单个 MUL 为 18.4GFLOP,单个 ADD 为 55.2 GFLOP (使用给定参数完成 kmeans 内核大约需要 14.5 毫秒)。
根据维基百科,GTX670 的峰值性能为 2460 GFLOPs。我离它还差得很远。除此之外,一些论文声称它们可以达到峰值性能的一半以上。我不知道如何进一步优化这个内核代码。我可以对内核进行任何优化吗?如有任何建议或帮助,我们将不胜感激,我可以根据需要提供任何其他信息。
提前致谢。
#define SIZE 1024*1024 //number of points
#define CENTERS 32 //number of cluster centroids
#define DIM 8 //dimension of each point and center
#define cudaTHREADSIZE 1024 //threads per block
#define cudaBLOCKSIZE SIZE/cudaTHREADSIZE //number of blocks for kernel
__global__ void kMeans(float *dp, float …Run Code Online (Sandbox Code Playgroud)