Странная производительность при умножении матриц с использованием AMP в зависимости от разметки памяти - PullRequest
0 голосов
/ 25 сентября 2018

Я начал экспериментировать с библиотекой 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 - это асинхронная операция.)

...