Как бы я использовал SSE, чтобы ускорить свертку разреженной матрицы с плавающей точкой? - PullRequest
0 голосов
/ 03 апреля 2020

Мне дали этот код C как часть задания. Моя задача - использовать OpenMP и Intel SSE, чтобы он работал быстрее. Я понимаю логику c, стоящую за 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
}
...