GPU в несколько раз медленнее CPU, как улучшить код? - PullRequest
0 голосов
/ 07 мая 2020

Это псевдокод моей программы:

data = float32[100000]
wid = 72    // a moving window to process the data
B, C = float32[72]    // use to process data
result = float32[99928]
for i = 0 : length(data) - wid    // the main loop
    w = data[i : i + wid]    // cut a window of data
    w = w / mean(w[0 : wid/2])    // a simple scaling
    tmp1 = sum((B - w).^2)
    tmp2 = sum((C - w).^2)
    result[i] = tmp1 / tmp2
end

И я пишу следующий код tensorflow 1.13.2, используя while_l oop для основного l oop и TensorArray для записи результат:

import numpy as np;
import tensorflow as tf;
import time;

def cond(result, i, len, hwid, data, B, C):
    return i < len-2*hwid;

def body(result, i, len, hwid, data, B, C):
    w = data[i : i+2*hwid ] / tf.reduce_mean(data[i : i+hwid]);
    tmp = tf.cast(tf.reduce_sum((B-w)**2)/tf.reduce_sum((C-w)**2), tf.float32);
    result = result.write(i, tmp);
    i += 1;
    return result, i, len, hwid, data, B, C

hwid = 36;
len = 30000;
with tf.device('/cpu:0'):
    data = tf.Variable(np.float32(np.random.rand(len)));
    B = tf.Variable(np.float32(np.random.rand(1, 2*hwid)));
    C = tf.Variable(np.float32(np.random.rand(1, 2*hwid)));
    result = tf.TensorArray(tf.float32, len - 2*hwid + 1);
    tmp3 = tf.while_loop(cond, body, [result, 0, len, hwid, data, B, C])[0].stack();
t0 = time.clock();
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res = tmp3.eval();
print(time.clock() - t0);

Кажется, этот код довольно неэффективен, запускайте код с GPU, даже в несколько раз медленнее, чем CPU. Как его улучшить?

...