首页 > 解决方案 > 我将如何使用 SSE 使稀疏浮点矩阵卷积更快?

问题描述

作为作业的一部分,我收到了这段 C 代码。我的任务是使用 OpenMP 和英特尔 SSE 使其运行得更快。我了解 SSE 和 OpenMP 背后的逻辑,但是我无法完全理解我的方法应该做什么。

我在下面给出了代码片段。任何帮助表示赞赏。

void team_conv_sparse(float *** image, struct sparse_matrix *** kernels,
               float *** output, int width, int height,
               int nchannels, int nkernels, int kernel_order) {

    int h, w, x, y, c, m, index;
    float value;

    // initialize the output matrix to zero
    for ( m = 0; m < nkernels; m++ ) {
        for ( h = 0; h < height; h++ ) {
            for ( w = 0; w < width; w++ ) {
                output[m][h][w] = 0.0;
            }
        }
    }

    DEBUGGING(fprintf(stderr, "w=%d, h=%d, c=%d\n", w, h, c));

    // now compute multichannel, multikernel convolution
//  #pragma omp parallel for
    for ( w = 0; w < width; w++ ) {
        for ( h = 0; h < height; h++ ) {
            for ( x = 0; x < kernel_order; x++) {
                for ( y = 0; y < kernel_order; y++ ) {
                    struct sparse_matrix * kernel = kernels[x][y];
                    for ( m = 0; m < nkernels; m++ ) {
                        for ( index = kernel->kernel_starts[m]; index < kernel->kernel_starts[m+1]; index++ ) {
                            int this_c = kernel->channel_numbers[index];
                            assert( (this_c >= 0) && (this_c < nchannels) );
                            value = kernel->values[index];
                            output[m][h][w] += image[w+x][h+y][this_c] * value;
                        }
                    } // m
                } // y
            } // x
        } // h
    }// w
}

标签: copenmpsparse-matrixsseconvolution

解决方案


推荐阅读