In [2]:
%matplotlib inline

In [3]:
import pylab as plt

In [4]:
import time
import sys
sys.path.insert(0, '/opt/usr/python/')

import astra
import numpy as np
import pandas as pd

In [5]:
def create_test_cube(size):
    # Create a simple hollow cube phantom
    cube = np.zeros((size,size,size), dtype='float32')
    x0 = int(128.*size/1024)
    x1 = int(895.*size/1024)
    y0 = int(256.*size/1024)
    y1 = int(767.*size/1024)
    cube[x0:x1,x0:x1,x0:x1] = 1
    cube[y0:y1,y0:y1,y0:y1,] = 0
    return cube

   
    
def test_projections_parallel(size, angles_count, gpus_list):
    # Set up multi-GPU usage.
    # This only works for 3D GPU forward projection and back projection.
    astra.astra.set_gpu_index(gpus_list)

    # Optionally, you can also restrict the amount of GPU memory ASTRA will use.
    # The line commented below sets this to 1GB.
    #astra.astra.set_gpu_index([0,1], memory=1024*1024*1024)
    

    angles = np.linspace(0, np.pi, angles_count, False)
    proj_geom = astra.create_proj_geom('parallel3d', 1.0, 1.0, size, size, angles)

    # Create a simple hollow cube phantom
    cube = create_test_cube(size)
    vol_geom = astra.create_vol_geom(cube.shape)
    cube_id = astra.data3d.create('-vol', vol_geom, cube)
    del cube
    
    print('Start create_sino3d_gpu')
    # Create projection data from this
    t=time.time()
    proj_id = astra.create_sino3d_gpu(cube_id, proj_geom, vol_geom, returnData=False)
    astra.data3d.delete(cube_id)
    
    t_proj = time.time()-t
    print('Takes: {}'.format(t_proj))

    print('Start astra.create_backprojection3d_gpu')
    # Backproject projection data
    t=time.time()
    bproj_id = astra.create_backprojection3d_gpu(proj_id, proj_geom, vol_geom, returnData=False)
    t_bproj = time.time()-t
    print('Takes: {}'.format(t_bproj))

    # Clean up. Note that GPU memory is tied up in the algorithm object,
    # and main RAM in the data objects.
    astra.data3d.info()
    astra.data3d.delete(proj_id)
    astra.data3d.delete(bproj_id)
    
    return size, angles_count, len(gpus_list), t_proj, t_bproj

def test_projections_cone(size, angles_count, gpus_list):
    # Set up multi-GPU usage.
    # This only works for 3D GPU forward projection and back projection.
    astra.astra.set_gpu_index(gpus_list)

    # Optionally, you can also restrict the amount of GPU memory ASTRA will use.
    # The line commented below sets this to 1GB.
    #astra.astra.set_gpu_index([0,1], memory=1024*1024*1024)
    

    angles = np.linspace(0, np.pi, angles_count, False)
    
    # Circular

    # Parameters: width of detector column, height of detector row, #rows, #columns,
    #             angles, distance source-origin, distance origin-detector
    
    # see example #5 from python samples
    # All distances in [pixels]
    pixel_size = 2.82473e-3
    os_distance = 56.135 / pixel_size # object-sample distance
    ds_distance = 225.082 / pixel_size # detector-sample distance
    detector_size = size
    
#     proj_geom = astra.create_proj_geom('cone', 1.0, 1.0, 32, 64, angles, 1000, 0)
    proj_geom = astra.create_proj_geom('cone', ds_distance / os_distance,ds_distance / os_distance,
                                       detector_size, detector_size, angles,
                                       os_distance, (ds_distance - os_distance))
#     proj_geom = astra.create_proj_geom('parallel3d', 1.0, 1.0, size, size, angles)

    # Create a simple hollow cube phantom
    cube = create_test_cube(size)
    vol_geom = astra.create_vol_geom(cube.shape)
    cube_id = astra.data3d.create('-vol', vol_geom, cube)
    del cube
    
    print('Start create_sino3d_gpu')
    # Create projection data from this
    t=time.time()
    proj_id = astra.create_sino3d_gpu(cube_id, proj_geom, vol_geom, returnData=False)
    astra.data3d.delete(cube_id)
    
    t_proj = time.time()-t
    print('Takes: {}'.format(t_proj))

    print('Start astra.create_backprojection3d_gpu')
    # Backproject projection data
    t=time.time()
    bproj_id = astra.create_backprojection3d_gpu(proj_id, proj_geom, vol_geom, returnData=False)
    t_bproj = time.time()-t
    print('Takes: {}'.format(t_bproj))

    # Clean up. Note that GPU memory is tied up in the algorithm object,
    # and main RAM in the data objects.
    astra.data3d.info()
    astra.data3d.delete(proj_id)
    astra.data3d.delete(bproj_id)
    
    return size, angles_count, len(gpus_list), t_proj, t_bproj

def test_reconstruction_cone_fdk(size, angles_count, gpus_list):
    # Set up multi-GPU usage.
    # This only works for 3D GPU forward projection and back projection.
    astra.astra.set_gpu_index(gpus_list)

    # Optionally, you can also restrict the amount of GPU memory ASTRA will use.
    # The line commented below sets this to 1GB.
    #astra.astra.set_gpu_index([0,1], memory=1024*1024*1024)
    

    angles = np.linspace(0, np.pi, angles_count, False)
    
    # Circular

    # Parameters: width of detector column, height of detector row, #rows, #columns,
    #             angles, distance source-origin, distance origin-detector
    
    # see example #5 from python samples
    # All distances in [pixels]
    pixel_size = 2.82473e-3
    os_distance = 56.135 / pixel_size # object-sample distance
    ds_distance = 225.082 / pixel_size # detector-sample distance
    detector_size = size
    
#     proj_geom = astra.create_proj_geom('cone', 1.0, 1.0, 32, 64, angles, 1000, 0)
    proj_geom = astra.create_proj_geom('cone', ds_distance / os_distance,ds_distance / os_distance,
                                       detector_size, detector_size, angles,
                                       os_distance, (ds_distance - os_distance))
#     proj_geom = astra.create_proj_geom('parallel3d', 1.0, 1.0, size, size, angles)

    # Create a simple hollow cube phantom
    cube = create_test_cube(size)
    vol_geom = astra.create_vol_geom(cube.shape)
    cube_id = astra.data3d.create('-vol', vol_geom, cube)
    del cube
    
    print('Start create_sino3d_gpu')
    # Create projection data from this
    t=time.time()
    proj_id = astra.create_sino3d_gpu(cube_id, proj_geom, vol_geom, returnData=False)
    
    t_proj = time.time()-t
    print('Takes: {}'.format(t_proj))

    # Set up the parameters for a reconstruction algorithm using the GPU
    cfg = astra.astra_dict('FDK_CUDA')
    cfg['ReconstructionDataId'] = cube_id
    cfg['ProjectionDataId'] = proj_id

    # Create the algorithm object from the configuration structure
    alg_id = astra.algorithm.create(cfg)
    
#     print('Start astra reconstruction FDK_CUDA')
#     # Backproject projection data
    t=time.time()
    astra.algorithm.run(alg_id, 1)
    t_bproj = time.time()-t
    print('Takes: {}'.format(t_bproj))
    
#     rec = astra.data3d.get(cube_id)
#     plt.figure()
#     plt.imshow(rec[:,:,int(rec.shape[-1]/2)])
#     plt.show()
    

    # Clean up. Note that GPU memory is tied up in the algorithm object,
    # and main RAM in the data objects.
    astra.data3d.info()
    astra.algorithm.delete(alg_id)
    astra.data3d.delete(proj_id)
    astra.data3d.delete(cube_id)
    
    return size, angles_count, len(gpus_list), t_proj, t_bproj

In [5]:
test_reconstruction_cone_fdk(1536,1536,[0,1])


Start create_sino3d_gpu
Takes: 96.5000932217
Takes: 97.2681100368
id  init  description
-----------------------------------------
1 	v     1536x1536x1536 volume data 	
2 	v     1536x1536x1536 sinogram data 	
-----------------------------------------

Out[5]:
(1536, 1536, 2, 96.50009322166443, 97.26811003684998)

In [8]:
rec=create_test_cube(1024)
plt.figure()
plt.imshow(rec[:,:,512])
plt.show()

plt.figure()
plt.imshow(rec[:,:,200])
plt.show()



In [8]:
sizes = [1024,]
print sizes

angles = [1024,]
print angles

gpu_config = [[0,1],[0,],[1,]]
print gpu_config


[1024]
[1024]
[[0, 1], [0], [1]]

In [6]:
with open('test_proj_bproj_parallel_3d.txt', 'a') as f:
    for angles_count in angles:
        for size in sizes:
            for gpu_list in gpu_config:
                res = test_projections_parallel(size, angles_count, gpu_list)
                f.write('\t'.join(map(lambda x: str(x),res)))
                f.write('\n')


Start create_sino3d_gpu
Takes: 0.41002702713
Start astra.create_backprojection3d_gpu
Takes: 0.0132400989532
id  init  description
-----------------------------------------
2 	v     128x128x128 sinogram data 	
4 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0148339271545
Start astra.create_backprojection3d_gpu
Takes: 0.0135180950165
id  init  description
-----------------------------------------
7 	v     128x128x128 sinogram data 	
9 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0156922340393
Start astra.create_backprojection3d_gpu
Takes: 0.0120189189911
id  init  description
-----------------------------------------
12 	v     128x128x128 sinogram data 	
14 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.045037984848
Start astra.create_backprojection3d_gpu
Takes: 0.0888438224792
id  init  description
-----------------------------------------
17 	v     256x128x256 sinogram data 	
19 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0700588226318
Start astra.create_backprojection3d_gpu
Takes: 0.0756530761719
id  init  description
-----------------------------------------
22 	v     256x128x256 sinogram data 	
24 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0595798492432
Start astra.create_backprojection3d_gpu
Takes: 0.0657629966736
id  init  description
-----------------------------------------
27 	v     256x128x256 sinogram data 	
29 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.262459993362
Start astra.create_backprojection3d_gpu
Takes: 0.442629814148
id  init  description
-----------------------------------------
32 	v     512x128x512 sinogram data 	
34 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.406136989594
Start astra.create_backprojection3d_gpu
Takes: 0.453795909882
id  init  description
-----------------------------------------
37 	v     512x128x512 sinogram data 	
39 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.399062871933
Start astra.create_backprojection3d_gpu
Takes: 0.428483963013
id  init  description
-----------------------------------------
42 	v     512x128x512 sinogram data 	
44 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 2.00346779823
Start astra.create_backprojection3d_gpu
Takes: 2.64047503471
id  init  description
-----------------------------------------
47 	v     1024x128x1024 sinogram data 	
49 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 4.55198788643
Start astra.create_backprojection3d_gpu
Takes: 3.29314398766
id  init  description
-----------------------------------------
52 	v     1024x128x1024 sinogram data 	
54 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 4.58184099197
Start astra.create_backprojection3d_gpu
Takes: 3.33736085892
id  init  description
-----------------------------------------
57 	v     1024x128x1024 sinogram data 	
59 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0174779891968
Start astra.create_backprojection3d_gpu
Takes: 0.0188529491425
id  init  description
-----------------------------------------
62 	v     128x256x128 sinogram data 	
64 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0317249298096
Start astra.create_backprojection3d_gpu
Takes: 0.0184299945831
id  init  description
-----------------------------------------
67 	v     128x256x128 sinogram data 	
69 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0258359909058
Start astra.create_backprojection3d_gpu
Takes: 0.0170319080353
id  init  description
-----------------------------------------
72 	v     128x256x128 sinogram data 	
74 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0770258903503
Start astra.create_backprojection3d_gpu
Takes: 0.0891530513763
id  init  description
-----------------------------------------
77 	v     256x256x256 sinogram data 	
79 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.11448597908
Start astra.create_backprojection3d_gpu
Takes: 0.0951900482178
id  init  description
-----------------------------------------
82 	v     256x256x256 sinogram data 	
84 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0958209037781
Start astra.create_backprojection3d_gpu
Takes: 0.0897631645203
id  init  description
-----------------------------------------
87 	v     256x256x256 sinogram data 	
89 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.434204101562
Start astra.create_backprojection3d_gpu
Takes: 0.526471138
id  init  description
-----------------------------------------
92 	v     512x256x512 sinogram data 	
94 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.711032867432
Start astra.create_backprojection3d_gpu
Takes: 0.637423992157
id  init  description
-----------------------------------------
97 	v     512x256x512 sinogram data 	
99 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.713131904602
Start astra.create_backprojection3d_gpu
Takes: 0.667053937912
id  init  description
-----------------------------------------
102 	v     512x256x512 sinogram data 	
104 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 3.32105588913
Start astra.create_backprojection3d_gpu
Takes: 3.85242414474
id  init  description
-----------------------------------------
107 	v     1024x256x1024 sinogram data 	
109 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 8.2243719101
Start astra.create_backprojection3d_gpu
Takes: 5.31523394585
id  init  description
-----------------------------------------
112 	v     1024x256x1024 sinogram data 	
114 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 8.40602087975
Start astra.create_backprojection3d_gpu
Takes: 5.58904290199
id  init  description
-----------------------------------------
117 	v     1024x256x1024 sinogram data 	
119 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0361981391907
Start astra.create_backprojection3d_gpu
Takes: 0.0179688930511
id  init  description
-----------------------------------------
122 	v     128x512x128 sinogram data 	
124 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0344529151917
Start astra.create_backprojection3d_gpu
Takes: 0.0247509479523
id  init  description
-----------------------------------------
127 	v     128x512x128 sinogram data 	
129 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0309031009674
Start astra.create_backprojection3d_gpu
Takes: 0.0220899581909
id  init  description
-----------------------------------------
132 	v     128x512x128 sinogram data 	
134 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.123907089233
Start astra.create_backprojection3d_gpu
Takes: 0.100011110306
id  init  description
-----------------------------------------
137 	v     256x512x256 sinogram data 	
139 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.193532943726
Start astra.create_backprojection3d_gpu
Takes: 0.14466381073
id  init  description
-----------------------------------------
142 	v     256x512x256 sinogram data 	
144 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.170521974564
Start astra.create_backprojection3d_gpu
Takes: 0.143692970276
id  init  description
-----------------------------------------
147 	v     256x512x256 sinogram data 	
149 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.759443044662
Start astra.create_backprojection3d_gpu
Takes: 0.730610132217
id  init  description
-----------------------------------------
152 	v     512x512x512 sinogram data 	
154 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 1.33484697342
Start astra.create_backprojection3d_gpu
Takes: 1.03455305099
id  init  description
-----------------------------------------
157 	v     512x512x512 sinogram data 	
159 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 1.33218693733
Start astra.create_backprojection3d_gpu
Takes: 1.05419111252
id  init  description
-----------------------------------------
162 	v     512x512x512 sinogram data 	
164 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 6.02392601967
Start astra.create_backprojection3d_gpu
Takes: 8.22040009499
id  init  description
-----------------------------------------
167 	v     1024x512x1024 sinogram data 	
169 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 10.8233520985
Start astra.create_backprojection3d_gpu
Takes: 11.3663868904
id  init  description
-----------------------------------------
172 	v     1024x512x1024 sinogram data 	
174 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 10.8739550114
Start astra.create_backprojection3d_gpu
Takes: 11.3212890625
id  init  description
-----------------------------------------
177 	v     1024x512x1024 sinogram data 	
179 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.052323102951
Start astra.create_backprojection3d_gpu
Takes: 0.0337371826172
id  init  description
-----------------------------------------
182 	v     128x1024x128 sinogram data 	
184 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0881600379944
Start astra.create_backprojection3d_gpu
Takes: 0.0437591075897
id  init  description
-----------------------------------------
187 	v     128x1024x128 sinogram data 	
189 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0676069259644
Start astra.create_backprojection3d_gpu
Takes: 0.0409069061279
id  init  description
-----------------------------------------
192 	v     128x1024x128 sinogram data 	
194 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.243319988251
Start astra.create_backprojection3d_gpu
Takes: 0.175822973251
id  init  description
-----------------------------------------
197 	v     256x1024x256 sinogram data 	
199 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.35257101059
Start astra.create_backprojection3d_gpu
Takes: 0.262737989426
id  init  description
-----------------------------------------
202 	v     256x1024x256 sinogram data 	
204 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.336876869202
Start astra.create_backprojection3d_gpu
Takes: 0.2641248703
id  init  description
-----------------------------------------
207 	v     256x1024x256 sinogram data 	
209 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 1.47547507286
Start astra.create_backprojection3d_gpu
Takes: 1.08841609955
id  init  description
-----------------------------------------
212 	v     512x1024x512 sinogram data 	
214 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 2.56392502785
Start astra.create_backprojection3d_gpu
Takes: 1.87191200256
id  init  description
-----------------------------------------
217 	v     512x1024x512 sinogram data 	
219 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 2.51740098
Start astra.create_backprojection3d_gpu
Takes: 1.90975213051
id  init  description
-----------------------------------------
222 	v     512x1024x512 sinogram data 	
224 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 14.1859989166
Start astra.create_backprojection3d_gpu
Takes: 14.2273211479
id  init  description
-----------------------------------------
227 	v     1024x1024x1024 sinogram data 	
229 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 22.1449580193
Start astra.create_backprojection3d_gpu
Takes: 20.3734610081
id  init  description
-----------------------------------------
232 	v     1024x1024x1024 sinogram data 	
234 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 22.0226209164
Start astra.create_backprojection3d_gpu
Takes: 20.5559101105
id  init  description
-----------------------------------------
237 	v     1024x1024x1024 sinogram data 	
239 	v     1024x1024x1024 volume data 	
-----------------------------------------


In [144]:
with open('test_proj_bproj_cone_3d.txt', 'a') as f:
    for angles_count in angles:
        for size in sizes:
            for gpu_list in gpu_config:
                res = test_projections_cone(size, angles_count, gpu_list)
                f.write('\t'.join(map(lambda x: str(x),res)))
                f.write('\n')


Start create_sino3d_gpu
Takes: 0.0701348781586
Start astra.create_backprojection3d_gpu
Takes: 0.0246939659119
id  init  description
-----------------------------------------
242 	v     128x512x128 sinogram data 	
244 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0522820949554
Start astra.create_backprojection3d_gpu
Takes: 0.0315330028534
id  init  description
-----------------------------------------
247 	v     128x512x128 sinogram data 	
249 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0435647964478
Start astra.create_backprojection3d_gpu
Takes: 0.0270969867706
id  init  description
-----------------------------------------
252 	v     128x512x128 sinogram data 	
254 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.147379875183
Start astra.create_backprojection3d_gpu
Takes: 0.125758886337
id  init  description
-----------------------------------------
257 	v     256x512x256 sinogram data 	
259 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.271838903427
Start astra.create_backprojection3d_gpu
Takes: 0.16349196434
id  init  description
-----------------------------------------
262 	v     256x512x256 sinogram data 	
264 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.242198944092
Start astra.create_backprojection3d_gpu
Takes: 0.150063991547
id  init  description
-----------------------------------------
267 	v     256x512x256 sinogram data 	
269 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 1.05081796646
Start astra.create_backprojection3d_gpu
Takes: 0.746268987656
id  init  description
-----------------------------------------
272 	v     512x512x512 sinogram data 	
274 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 1.796448946
Start astra.create_backprojection3d_gpu
Takes: 1.04532408714
id  init  description
-----------------------------------------
277 	v     512x512x512 sinogram data 	
279 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 1.81215286255
Start astra.create_backprojection3d_gpu
Takes: 1.05207800865
id  init  description
-----------------------------------------
282 	v     512x512x512 sinogram data 	
284 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 7.94971394539
Start astra.create_backprojection3d_gpu
Takes: 9.66055083275
id  init  description
-----------------------------------------
287 	v     1024x512x1024 sinogram data 	
289 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 14.4400219917
Start astra.create_backprojection3d_gpu
Takes: 12.5841779709
id  init  description
-----------------------------------------
292 	v     1024x512x1024 sinogram data 	
294 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 14.4623661041
Start astra.create_backprojection3d_gpu
Takes: 12.7076518536
id  init  description
-----------------------------------------
297 	v     1024x512x1024 sinogram data 	
299 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0646891593933
Start astra.create_backprojection3d_gpu
Takes: 0.0344519615173
id  init  description
-----------------------------------------
302 	v     128x1024x128 sinogram data 	
304 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.110052108765
Start astra.create_backprojection3d_gpu
Takes: 0.0516970157623
id  init  description
-----------------------------------------
307 	v     128x1024x128 sinogram data 	
309 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.0739278793335
Start astra.create_backprojection3d_gpu
Takes: 0.0429198741913
id  init  description
-----------------------------------------
312 	v     128x1024x128 sinogram data 	
314 	v     128x128x128 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.25839805603
Start astra.create_backprojection3d_gpu
Takes: 0.190922021866
id  init  description
-----------------------------------------
317 	v     256x1024x256 sinogram data 	
319 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.470149993896
Start astra.create_backprojection3d_gpu
Takes: 0.264949083328
id  init  description
-----------------------------------------
322 	v     256x1024x256 sinogram data 	
324 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 0.423223972321
Start astra.create_backprojection3d_gpu
Takes: 0.269165039062
id  init  description
-----------------------------------------
327 	v     256x1024x256 sinogram data 	
329 	v     256x256x256 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 1.92107987404
Start astra.create_backprojection3d_gpu
Takes: 1.20915007591
id  init  description
-----------------------------------------
332 	v     512x1024x512 sinogram data 	
334 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 3.42391300201
Start astra.create_backprojection3d_gpu
Takes: 1.87111592293
id  init  description
-----------------------------------------
337 	v     512x1024x512 sinogram data 	
339 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 3.42310285568
Start astra.create_backprojection3d_gpu
Takes: 1.90588712692
id  init  description
-----------------------------------------
342 	v     512x1024x512 sinogram data 	
344 	v     512x512x512 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 17.2728118896
Start astra.create_backprojection3d_gpu
Takes: 15.6197938919
id  init  description
-----------------------------------------
347 	v     1024x1024x1024 sinogram data 	
349 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 28.8800070286
Start astra.create_backprojection3d_gpu
Takes: 21.7563250065
id  init  description
-----------------------------------------
352 	v     1024x1024x1024 sinogram data 	
354 	v     1024x1024x1024 volume data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 28.9570569992
Start astra.create_backprojection3d_gpu
Takes: 21.9574699402
id  init  description
-----------------------------------------
357 	v     1024x1024x1024 sinogram data 	
359 	v     1024x1024x1024 volume data 	
-----------------------------------------


In [9]:
with open('test_rec_cone_3d.txt', 'a') as f:
    for angles_count in angles:
        for size in sizes:
            for gpu_list in gpu_config:
                res = test_reconstruction_cone_fdk(size, angles_count, gpu_list)
                f.write('\t'.join(map(lambda x: str(x),res)))
                f.write('\n')


Start create_sino3d_gpu
Takes: 16.4730708599
Takes: 21.5482540131
id  init  description
-----------------------------------------
1 	v     1024x1024x1024 volume data 	
2 	v     1024x1024x1024 sinogram data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 21.0576431751
Takes: 38.8112969398
id  init  description
-----------------------------------------
5 	v     1024x1024x1024 volume data 	
6 	v     1024x1024x1024 sinogram data 	
-----------------------------------------

Start create_sino3d_gpu
Takes: 27.9634079933
Takes: 34.658064127
id  init  description
-----------------------------------------
9 	v     1024x1024x1024 volume data 	
10 	v     1024x1024x1024 sinogram data 	
-----------------------------------------


In [7]:
stat = np.loadtxt('test_proj_bproj_parallel_3d.txt')

In [14]:
#!rm test_proj_bproj_parallel_3d.txt


rm: cannot remove ‘test_proj_bproj_parallel_3d.txt’: No such file or directory

In [100]:
size = stat[:,0]
angles_count =  stat[:,1]
gpus = stat[:,2]
t_proj = stat[:,3]
t_bproj = stat[:,4]

In [101]:
df = pd.DataFrame(stat,columns=['size', 'angles', 'ngpus', 't_proj', 't_bproj'])

In [102]:
db = df.groupby(['ngpus'])

In [129]:
plt.figure(figsize=(10,7))
gpu_index = db.groups[1]

plt.plot(df['size'][gpu_index],
         df['t_proj'][gpu_index]/df['size'][gpu_index]**3/df['angles'][gpu_index]*1e11,
         'o',
         label='Projection time (ngpu=1)')

plt.plot(df['size'][gpu_index],
         df['t_bproj'][gpu_index]/df['size'][gpu_index]**3/df['angles'][gpu_index]*1e11,
         'o',
         label='Back projection time (ngpu=1)')

# multi_gpu_index = db.groups[2]
# plt.plot(df['size'][multi_gpu_index],df['t_proj'][multi_gpu_index] , '*', label='Projection time (ngpu=2)')
# plt.plot(df['size'][multi_gpu_index],df['t_bproj'][multi_gpu_index] , 'x', label='Back projection time (ngpu=2)')
plt.ylabel('Time, s*1e-11')
plt.xlabel('Cube size, px')
plt.grid(True)
plt.legend(loc=0)
plt.show()



In [140]:
plt.figure(figsize=(10,7))
gpu_index = db.groups[1]

plt.plot(df['size'][gpu_index],
         df['t_proj'][gpu_index]/df['size'][gpu_index]**3/df['angles'][gpu_index]*1e11,
         'o',
         label='Projection time (ngpu=1)')

gpu_index = db.groups[2]
plt.plot(df['size'][gpu_index],
         df['t_proj'][gpu_index]/df['size'][gpu_index]**3/df['angles'][gpu_index]*1e11,
         'o',
         label='Projection time (ngpu=2)')
plt.ylim([0,6])

# multi_gpu_index = db.groups[2]
# plt.plot(df['size'][multi_gpu_index],df['t_proj'][multi_gpu_index] , '*', label='Projection time (ngpu=2)')
# plt.plot(df['size'][multi_gpu_index],df['t_bproj'][multi_gpu_index] , 'x', label='Back projection time (ngpu=2)')
plt.ylabel('Time, s*1e-11')
plt.xlabel('Cube size, px')
plt.grid(True)
plt.legend(loc=0)
plt.show()



In [137]:
plt.figure(figsize=(10,7))
gpu_index = db.groups[1]

plt.plot(df['size'][gpu_index],
         df['t_bproj'][gpu_index]/df['size'][gpu_index]**3/df['angles'][gpu_index]*1e11,
         'o',
         label='Back projection time (ngpu=1)')

gpu_index = db.groups[2]
plt.plot(df['size'][gpu_index],
         df['t_bproj'][gpu_index]/df['size'][gpu_index]**3/df['angles'][gpu_index]*1e11,
         'o',
         label='Back projection time (ngpu=2)')
plt.ylim([0,6])

# multi_gpu_index = db.groups[2]
# plt.plot(df['size'][multi_gpu_index],df['t_proj'][multi_gpu_index] , '*', label='Projection time (ngpu=2)')
# plt.plot(df['size'][multi_gpu_index],df['t_bproj'][multi_gpu_index] , 'x', label='Back projection time (ngpu=2)')
plt.ylabel('Time, s*1e-11')
plt.xlabel('Cube size, px')
plt.grid(True)
plt.legend(loc=0)
plt.show()



In [18]:
#-----------------------------------------------------------------------
#Copyright 2013 Centrum Wiskunde & Informatica, Amsterdam
#
#Author: Daniel M. Pelt
#Contact: D.M.Pelt@cwi.nl
#Website: http://dmpelt.github.io/pyastratoolbox/
#
#
#This file is part of the Python interface to the
#All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox").
#
#The Python interface to the ASTRA Toolbox is free software: you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation, either version 3 of the License, or
#(at your option) any later version.
#
#The Python interface to the ASTRA Toolbox is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with the Python interface to the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
#
#-----------------------------------------------------------------------

import astra
import numpy as np

vol_geom = astra.create_vol_geom(128, 128, 128)

angles = np.linspace(0, np.pi, 180,False)
# proj_geom = astra.create_proj_geom('parallel3d', 1.0, 1.0, 128, 192, angles)

pixel_size = 2.82473e-3
os_distance = 56.135 / pixel_size # object-sample distance
ds_distance = 225.082 / pixel_size # detector-sample distance
detector_size = 128
    
#     proj_geom = astra.create_proj_geom('cone', 1.0, 1.0, 32, 64, angles, 1000, 0)
proj_geom = astra.create_proj_geom('cone', ds_distance / os_distance,ds_distance / os_distance,
                                   detector_size, detector_size, angles,
                                   os_distance, (ds_distance - os_distance))

# Create a simple hollow cube phantom
cube = np.zeros((128,128,128))
cube[17:113,17:113,17:113] = 1
cube[33:97,33:97,33:97] = 0

# Create projection data from this
proj_id, proj_data = astra.create_sino3d_gpu(cube, proj_geom, vol_geom)

# Display a single projection image
import pylab
pylab.viridis()
pylab.figure(1)
pylab.imshow(proj_data[:,20,:])

# Create a data object for the reconstruction
rec_id = astra.data3d.create('-vol', vol_geom)

# Set up the parameters for a reconstruction algorithm using the GPU
cfg = astra.astra_dict('FDK_CUDA')
cfg['ReconstructionDataId'] = rec_id
cfg['ProjectionDataId'] = proj_id


# Create the algorithm object from the configuration structure
alg_id = astra.algorithm.create(cfg)

# Run 150 iterations of the algorithm
# Note that this requires about 750MB of GPU memory, and has a runtime
# in the order of 10 seconds.
astra.algorithm.run(alg_id, 1)

# Get the result
rec = astra.data3d.get(rec_id)
pylab.figure(2)
pylab.imshow(rec[:,:,64])
pylab.show()


# Clean up. Note that GPU memory is tied up in the algorithm object,
# and main RAM in the data objects.
astra.algorithm.delete(alg_id)
astra.data3d.delete(rec_id)
astra.data3d.delete(proj_id)



In [21]:
fp = np.memmap('1.tmp', dtype='float32', mode='w+', shape=(int(1e5),int(1e5)))

In [24]:
rm 1.tmp

In [ ]: