Код: Выделить всё
j
Код: Выделить всё
k
К сожалению, первая итерация работает за 0,1, но следующая итерация занимает 600 -е!
Я думаю Проблема по сути сводится к тому, что я использую Cupy в вложенной для петли, но я действительно не знаю, как избежать замедления, которое я получаю. Может быть, это связано с очередью памяти? Тем не менее, мои изображения довольно большие (800x800x200), поэтому именно поэтому я пытаюсь сделать это партиями вместо параллельно. Программирование графического процессора в Python. Дайте мне знать, если я смогу уточнить, чтобы помочь вам помочь мне! < /P>
Вот фрагмент соответствующего кода, если он полезен для диагностики. Функция Skern3 использует исключительно Cupy Arrays и возвращает массив Cupy.
Код: Выделить всё
from cupyx.scipy.ndimage import convolve as convolve_gpu
energy_const = (1/np.sqrt(xi_list**2+2*a**2))
x = cp.asarray(x)
y = cp.asarray(y)
z = cp.asarray(z)
xi_list = cp.asarray(xi_list)
theta_list = cp.asarray(theta_list)
phi_list = cp.asarray(phi_list)
a = cp.asarray(a)
fib_sum_log = cp.asarray(fib_sum_log)
energy_const = cp.asarray(energy_const)
# Pre-calculate wavelet energies (if needed)
wavelet_ener = cp.zeros(xi_list.size)
for k in range(xi_list.size):
xi = xi_list[k]
wavelet = S.skern3(x,y,z, a, theta_list[0], phi_list[0], xi) # Use arbitrary theta/phi for initial calc
wavelet_ener[k] = cp.sum(cp.abs(wavelet)**2)
# Pre-allocate output arrays on the GPU
trans_ener = cp.zeros((theta_list.size, phi_list.size, xi_list.size))
var_image = cp.zeros((theta_list.size, phi_list.size, xi_list.size))
max_image = cp.zeros((theta_list.size, phi_list.size, xi_list.size))
for i in range(theta_list.size):
start = time.time()
theta = theta_list[i]
for j in range(phi_list.size):
phi = phi_list[j]
# Calculate wavelet *ONCE* for this theta and phi
for k in range(xi_list.size):
xi = xi_list[k]
wavelet = S.skern3(x,y,z, a, theta, phi, xi)
# No more freeing memory inside the loop!
G_Ixy = convolve_gpu(fib_sum_log, wavelet) # Make sure fib_sum_log is a CuPy array
print('Post Convolution')
print('mempool used bytes: ' + str(mempool.used_bytes()))
print('mempool total bytes: ' + str(mempool.total_bytes()))
print('pinned mempool free blocks: ' + str(pinned_mempool.n_free_blocks()))
print('=======================================================================\n')
images_wt = cp.multiply(energy_const[k], G_Ixy) # Make sure energy_const is a CuPy array
trans_ener[i, j, k] = cp.sum(cp.abs(G_Ixy)**2)
var_image[i, j, k] = cp.sqrt(cp.var(G_Ixy))
max_image[i, j, k] = cp.max(G_Ixy)
# Report time
end = time.time()
print('average time row ' + '{:.1f}'.format(100*i/num_tpoints) + ' [%]: ' + str(end-start) + ' s')
< /code>
Я попытался сделать все внутри петли для массива Cupy, чтобы избежать передачи накладных расходов. И это работает ... но мне нужно повторить, поэтому я не уверен, что я должен сделать. n_free_blocks ()
ценю любые советы.
Подробнее здесь: https://stackoverflow.com/questions/794 ... -execution