Я начал экспериментировать с библиотекой AMP - ускоренного массивного параллелизма от Microsoft.
Я написал код для вычисления C = A * B (или C = A * B ^ T).
MyИнтуиция CPU предполагает, что наличие транспонированной матрицы B в качестве входных данных должно обеспечить значительное увеличение производительности.Циклы и доступы будут тогда:
for(y) for(x) for(k) C[y][x] = A[y][k] * B[x][k];
При работе на GPU этот вариант на порядок медленнее, чем без транспонирования - при B[k][x]
время работы уменьшается с 700 мс до 100 мс.
Это не имеет смысла для меня.Кто-нибудь может объяснить это поведение?В более общем смысле, каковы правила размещения памяти для написания эффективных алгоритмов графического процессора?
Код, выдающий приведенные выше результаты: https://gist.github.com/Noxitu/d961889140691693072562eac08e50bc
(я думаю, что AMP устанавливается с Visual Studio по умолчанию.)
(Обратите внимание, что код утверждает, что большую часть времени тратится на вызов "synchronize", но из-за согласованности моих тестов я считаю, что parallel_for_each
- это асинхронная операция.)