Мне дали этот код 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
}