Мне нужно диагонализировать большое количество 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.