【问题标题】:Matrix vector product CUDA performances矩阵向量积 CUDA 性能
【发布时间】:2016-12-03 05:50:28
【问题描述】:

我在上一个主题中找到了一些关于 cuda 矩阵向量积的代码: Matrix-vector multiplication in CUDA: benchmarking & performance 我首先想知道为什么作者没有将共享内存用于 dA(矩阵)?

然后,为什么列主排序比行主排序快?

代码如下:

    template<typename T>
__global__ void matvec_kernel(const T * __restrict__ dA, const T * __restrict__ dx, T * __restrict__ dy, const unsigned int nRows, const unsigned int nCols)
{
    const unsigned int tid = threadIdx.x + blockIdx.x * blockDim.x;

    __shared__ T x_shared[BLOCK_SIZE];

    T y_val = 0.0;

    #pragma unroll
    for (unsigned int m = 0; m < ((nCols + BLOCK_SIZE - 1)/ BLOCK_SIZE); ++m)
    {
        if ((m * BLOCK_SIZE + threadIdx.x) <  nCols) x_shared[threadIdx.x] = dx[threadIdx.x + m * BLOCK_SIZE];
        else                                         x_shared[threadIdx.x] = 0.f;
        __syncthreads();

        #pragma unroll
        for (unsigned int e = 0; e < BLOCK_SIZE; ++e) {
            // --- Column-major ordering - faster
            y_val += dA[tid + (e + BLOCK_SIZE * m) * nRows] * x_shared[e];
            // --- Row-major ordering - slower
            //y_val += dA[tid * nCols + (e + BLOCK_SIZE * m)] * x_shared[e];
        }

        __syncthreads();
    }

    if (tid < nRows) dy[tid] = y_val;

}

我正在考虑这两个问题 1 天,这就是我在这里的原因。

非常感谢!

【问题讨论】:

    标签: c++ c cuda gpgpu


    【解决方案1】:

    这里的共享内存用作缓存。向量的分量会被多次读取,而矩阵的分量在计算过程中只会被读取一次。这就是为什么代码只缓存向量而不缓存矩阵的原因。

    列主矩阵更快,因为在读取矩阵时,线程沿着矩阵列组织。 Col-major 因此确保coalesced global memory access。如果矩阵是行优先的,则应以不同的方式实现 CUDA 内核以实现最大性能。

    【讨论】:

    • 所以为了获得最大的行专业性能,我需要使用 threadIdx.y 和 nRows 而不是 threadIdx.x / nCols(在矩阵读取阶段)?
    • @TitouanParcollet 不会。它和上面的内核会有很大的不同。上面的每个矩阵行使用一个线程,这实际上在性能方面并不是最优的,除非矩阵非常大。对于行主矩阵,您可以为每个矩阵行使用一个线程块,并使用并行归约来计算行总和。
    • 好吧,我对 GPGPU 和 CUDA 还很陌生……我会尽力而为,感谢您的回答。但是很奇怪我找不到“标准”矩阵向量乘积内核。是不是可以做一个标准的简单内核来做这个?
    • 是的,我听说过 cuBLAS,但实际上我不能使用它。我需要基于实数构建自己的神经网络,以便与另一个使用超复数的神经网络进行比较.为了实现这个目标,我现在需要对代码进行每一次优化以比较两个神经网络......使用 cuBLAS 我将无法做到这一点,因为我不能使用 cuBLAS 和超复杂数字: /
    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2014-12-12
    • 2015-02-03
    • 2013-09-02
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多