Эффективное вычисление продуктов кронекера на C

Я новичок в C, и для большей части моих исследований мне не нужно было что-то более быстрое, чем python. Однако оказалось, что недавняя работа, которую я выполнял, требовала вычисления довольно больших векторов / матриц, и поэтому решение C + MPI могло бы быть подходящим.

С математической точки зрения задача очень проста. У меня много векторов размерности ~ 40k, и я хочу вычислить произведение Кронекера выбранных пар этих векторов, а затем суммировать эти произведения кронекера.

Вопрос в том, как это сделать эффективно? Что-то не так со следующей структурой кода, использованием циклов for или получением эффекта?

Функция kron , описанная ниже, передает векторы A и B ] длин vector_size , и вычисляет их кронекеровское произведение, которое хранит в C , матрице vector_size * vector_size .

void kron(int *A, int *B, int *C, int vector_size) {

    int i,j;

    for(i = 0; i < vector_size; i++) {
        for (j = 0; j < vector_size; j++) {
            C[i*vector_size+j] = A[i] * B[j];
        }
    }
    return;
}

Мне это кажется прекрасным, и, конечно (если я не допустил глупой синтаксической ошибки), дает правильный результат, но у меня есть скрытое подозрение, что встроенные циклы for не оптимальны. Если там' По-другому я должен поступить так, пожалуйста, дайте мне знать. Предложения приветствуются.

Благодарю вас за терпение и любые советы, которые у вас могут быть. Еще раз, я очень неопытен в C, но поиск в Google не принес мне большого удовольствия в ответ на этот запрос.

9
задан Edward Grefenstette 9 February 2011 в 00:31
поделиться