169 похожих чатов

Изучаю как работает многопоточность в Julia, решил для примера написать

примитивное умножение матриц
Где я накосячил и как можно улучшить этот код?
Знаю, что в BLAS оно параллелится из коробки, но хотелось руками пощупать, а не готовое использовать.
function multiplyMatrices_oneThreadLoop(A::Matrix{Float64}, B::Matrix{Float64}, N::Int64)
C = zeros(N, N)
Threads.@threads for i in 1:N
for j in 1:N
for k in 1:N
C[i, j]+= A[i, k] * B[k, j]
end
end

end
return C
end

6 ответов

1 просмотр

Общие рекомендации сходу: * цикл по строкам всегда быстрее, чем цикл по колонкам (к вопросу о порядке вложенности циклов) * эффективно параллелить можно на количество потоков, не превышающее количество ядер. При этом, каждая задача должна быть достаточно длинной (ориентироваться на 50 мс и больше) * можно отключить проверку границ @inbounds

ну и, кстати, если циклы предполагают заполненине абсолютно всей матрицы С, то C = zeros(N, N) - это избыточная операция инициализации, которая тоже требует время. Лучше просто выделить память при помощи Matrix{Float64}(undef, N, N).

David-Golovatin Автор вопроса
Roman Samarev
ну и, кстати, если циклы предполагают заполненине ...

А разве использование undef не приведёт к погрешностям при подсчете C[i, j]?

David Golovatin
А разве использование undef не приведёт к погрешно...

но там же явная инициализаци C[i, j]+= A[i, k] * B[k, j]

David-Golovatin Автор вопроса
David Golovatin
А разве использование undef не приведёт к погрешно...

Судя по всему, я напоролся на data-race, так как если использовать undef при инициализации C, то в результирующей матрице начинают появляться NaN'ы

David Golovatin
Судя по всему, я напоролся на data-race, так как е...

нет, там же в коде +=. Я не заметил это. Тогда оптимальный вариант - считать в отдельную переменную то, что там на цикле с k и однократно записывать в C[i,j]. Заодно уйдёт лишний расчёт косвенных адресов

Похожие вопросы

Обсуждают сегодня

а проверьте, собирается ли у кого сейчас транк лазаря через делюкс? у меня вот: fpcupdeluxe: info: Lazarus Native Installer (BuildModuleCustom: UserIDE): LazBuild: building Us...
Iluha Companets
20
добрый день. возможно ли изменить цвет окон лазаруса? Как?
Budemposmotret
35
This is a big issue. Just by being a citizen of a country, you are denied to contribute to Open Source software: https://youtu.be/L5Ec5jrpLVk?si=1iIuHnMPbCB4anV-
Sharuzzaman Ahmat Raslan
72
Господа, а кто-нибудь сталкивался с размещением на TTabControl/TTabSheet множества контролов (> 100) с последующими External: Access violation? Вот буквально на ровном месте. ...
Dmitry
29
Вот например простой пример, как получить стоимость хешрейта монеты монеро с сайта whattomine.com c использование сеарилизатора при парсинге JSON TaskProfit := TTask.Run(proc...
Delphi Coder
2
ну так че, сделать програмулину, в которую можно добавлять в Едиты свои строчки кода(закладки) а потом по ним прыгать. ну и сохраняться они естественно будут той програмуленно...
Kraszx
15
Приветствую всех!)) Подскажите, а кто мог бы написать на делфи движок (самую базу) интерпретатора очень легковесного и минималистичного языка программирования? Язык - проце...
Моринаро
8
А какие существуют способы обработки ошибок выделения памяти в ядре? Т.е., допустим, есть функция, которая возвращает адрес свободной страницы в физической памяти и диапазон в...
disba1ancer
51
Does anyone have some zeroday's left?
Wito!d ♥️🩷
44
#include <stdlib.h> #include <stdio.h> #include <math.h> #include <assert.h> #include <limits.h> long long avg3(long long a, long long b, long long c) { if (a == b && b =...
Malformed C
4
Карта сайта