Комментарии 4
CPU код для моделирования нагрева пластины, в котором используется FEniCS, не имеет практически ничего общего с кодом, использующим Cython+CUDA.
Первый решает задачу теплопроводности конечными элементами на треугольной сетке неявным методом. Второй же решает уравнение Лапласа (то есть ищет стационарное распределение температуры) конечными разностями на прямоугольной сетке итерационным методом Якоби. По сути, первый вариант на каждом шаге решает задачу, эквивалентную той, которую решает второй вариант.
Конечно, в таких условиях выигрыш будет на стороне GPU. Я не сомневаюсь, что эту задачу можно на GPU решить гораздо быстрее, но давайте делать честные сравнения!
Первый решает задачу теплопроводности конечными элементами на треугольной сетке неявным методом. Второй же решает уравнение Лапласа (то есть ищет стационарное распределение температуры) конечными разностями на прямоугольной сетке итерационным методом Якоби. По сути, первый вариант на каждом шаге решает задачу, эквивалентную той, которую решает второй вариант.
Конечно, в таких условиях выигрыш будет на стороне GPU. Я не сомневаюсь, что эту задачу можно на GPU решить гораздо быстрее, но давайте делать честные сравнения!
Люто плюсую.
Сравнивать производительность разных методов решения разных задач на разных железяках — очень странная идея.
Наверное не совсем корректно сформулировали. Код с FEniCS просто для примера расчетов приведен. Сравнение проводилось именно с корректной NumPy имплементацией. Внесли правки в пост
Сравнивать будем с 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
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Чистый Cython VS nvc++: жжем металлические пластины на GPU для сравнения скорости