CUDA中数组行的最小值

时间:2016-08-06 21:22:33

标签: c++ cuda

给定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)

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

在行主矩阵中查找数组行的最小值是一个并行缩减问题,已在堆栈溢出中多次讨论过。例如,这个。

Reduce matrix rows with CUDA

基本思想是在网格中使用n块。每个块包含固定数量的线程,通常为256个。每个线程块将在m元素的一行上进行并行缩减,以便在协作下找到最小值。

对于可以充分利用GPU的足够大的矩阵,性能上限是复制矩阵一次的一半。

相关问题