Обновить
Комментарии 4
CPU код для моделирования нагрева пластины, в котором используется FEniCS, не имеет практически ничего общего с кодом, использующим Cython+CUDA.
Первый решает задачу теплопроводности конечными элементами на треугольной сетке неявным методом. Второй же решает уравнение Лапласа (то есть ищет стационарное распределение температуры) конечными разностями на прямоугольной сетке итерационным методом Якоби. По сути, первый вариант на каждом шаге решает задачу, эквивалентную той, которую решает второй вариант.
Конечно, в таких условиях выигрыш будет на стороне GPU. Я не сомневаюсь, что эту задачу можно на GPU решить гораздо быстрее, но давайте делать честные сравнения!

Люто плюсую.
Сравнивать производительность разных методов решения разных задач на разных железяках — очень странная идея.

Наверное не совсем корректно сформулировали. Код с FEniCS просто для примера расчетов приведен. Сравнение проводилось именно с корректной NumPy имплементацией. Внесли правки в пост

Сравнивать будем с NumPy имплементацией:

def jacobi_solver(data, max_diff, max_iter):
    """
    Heat equation solver based on the Jacobi method.
    
    data : 2-dimensional array
        Initial data
    max_diff : float
        Parameter controlling convergence
    max_iter : int
        Maximum number of Jacobi iterations to perform
    """
    temp = data.copy()  # Jacobi iteration needs two copies of data
    keep_going = True
    iterations = 0
    while keep_going and iterations < max_iter:
        iterations += 1
        data[1:-1, 1:-1] = (
            temp[:-2, 1:-1] + temp[2:, 1:-1] + temp[1:-1, 2:] + temp[1:-1, :-2]
        ) * 0.25
        keep_going = np.any(np.abs(data - temp) > max_diff)
        data, temp = temp, data
    return iterations
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.