Сравнительный анализ собственных значений в тензорном потоке ЦП и ГП: ЦП выигрывает? - PullRequest
0 голосов
/ 04 января 2019

Мне нужно диагонализировать большое количество N x N положительно определенных матриц, организованных в тензор TensorFlow с размером batch_size x N x N

Я всегда думал, что GPU быстрее выполнял подобные вычисления из-за высокого уровня параллелизма. Я был явно неправ.

Я попробовал простой тест, сравнивая результаты AMD Ryzen 7 1700 8 ядер с приличным графическим процессором, Nvidia 1060 3GB, Cuda 9.1. Все результаты сделаны с последней версией tensorflow 1.12 на Ubuntu 16.04 x64. Тест MWE следующий:

import tensorflow as tf
import time

N = 512
batch_size = 2**8

with tf.device('/device:CPU:0'):
    P = tf.random_uniform([batch_size,N,N],dtype=tf.float32, minval=0.0, maxval=1.0)
    P = (tf.linalg.transpose(P) + P) / 2.0
    P = tf.matrix_set_diag(P, tf.constant([0.0], shape=[batch_size,N]))
    L = tf.matrix_diag(tf.reduce_sum(P,axis=1)) - P
    l = tf.linalg.eigvalsh(L)
    # Initialize the global variables
    init = tf.global_variables_initializer()

    with tf.Session() as sess:
        start = time.time()
        print(sess.run(l).shape)
        end = time.time()
        print('Elapsed time = ', end - start)

На моем процессоре для решения 2 ** 8 независимых задач на собственные значения требуется около 0,8 секунд, а если я переключусь на графический процессор, установив with tf.device('/device/GPU:0)', то результаты будут смущающими: почти 16 секунд.

Насколько я знаю, tensorflow полагается на библиотеки CUDA Blas для процедур на собственные значения. Это нормально, они такие медленные?

P.S Я могу воспроизвести более или менее одинаковые результаты на ядре Xeon 8 с GTX 1070Ti.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...