给定n-by-m矩阵,我想在CUDA中构建一个包含每个矩阵行最小值的n大小的向量。
到目前为止,我已经完成了这个:
__global__ void OnMin(float * Mins, const float * Matrix, const int n, const int m) {
int i = threadIdx.x + blockDim.x * blockIdx.x;
if (i < n) {
Mins[i] = Matrix[m * i];
for (int j = 1; j < m; ++j){
if (Matrix[m * i + j] < Mins[i])
Mins[i] = Matrix[m * i + j];
}
}
}
呼吁:
OnMin<<<(n + TPB - 1) / TPB, TPB>>>(Mins, Matrix, n, m);
但是我认为可以存在更优化的东西。
我尝试在循环中调用cublasIsamin
,但速度较慢。
我也尝试从OnMin内核启动内核(全局)但没有成功......(sm_35,compute_35引发编译错误......我有一个GTX670)
有什么想法吗?
谢谢!
答案 0 :(得分:1)
在行主矩阵中查找数组行的最小值是一个并行缩减问题,已在堆栈溢出中多次讨论过。例如,这个。
基本思想是在网格中使用n
块。每个块包含固定数量的线程,通常为256个。每个线程块将在m
元素的一行上进行并行缩减,以便在协作下找到最小值。
对于可以充分利用GPU的足够大的矩阵,性能上限是复制矩阵一次的一半。