Changeset a42fec0 in sasmodels for Models


Ignore:
Timestamp:
Aug 4, 2014 5:20:07 PM (10 years ago)
Author:
HMP1 <helen.park@…>
Branches:
master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
8cdb9f1
Parents:
099e053
Message:

Speed-up of 3X, compare.py working

Location:
Models
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • Models/code_capcyl.py

    rca6c007 ra42fec0  
    33 
    44import numpy as np 
    5 from math import asin, sqrt, fabs, atan 
     5from math import sqrt, fabs, atan 
    66import pyopencl as cl 
    77 
    88from weights import GaussianDispersion 
    9 from sasmodel import card 
     9from sasmodel import card, set_precision 
    1010 
    1111 
    12 def set_precision(src, qx, qy, dtype): 
    13     qx = np.ascontiguousarray(qx, dtype=dtype) 
    14     qy = np.ascontiguousarray(qy, dtype=dtype) 
    15     if np.dtype(dtype) == np.dtype('float32'): 
    16         header = """\ 
    17 #define real float 
    18 """ 
    19     else: 
    20         header = """\ 
    21 #pragma OPENCL EXTENSION cl_khr_fp64: enable 
    22 #define real double 
    23 """ 
    24     return header+src, qx, qy 
    2512 
    2613class GpuCapCylinder(object): 
     
    5037 
    5138        _ctx,queue = card() 
     39        self.res[:] = 0 
     40        cl.enqueue_copy(queue, self.res_b, self.res) 
    5241        rad_cyl,length,rad_cap,theta,phi = \ 
    5342            [GaussianDispersion(int(pars[base+'_pd_n']), pars[base+'_pd'], pars[base+'_pd_nsigma']) 
     
    7968                                        real(rad_cyl.weight[i]), real(length.weight[j]), real(theta.weight[k]), np.uint32(self.qx.size), np.uint32(size)) 
    8069 
    81                             cl.enqueue_copy(queue, self.res, self.res_b) 
    82  
    83                             sum += self.res 
    8470                            vol += rad_cyl.weight[i]*length.weight[j]*rad_cap.weight[m]*vol_i 
    8571                            norm_vol += rad_cyl.weight[i]*length.weight[j]*rad_cap.weight[m] 
    8672                            norm += rad_cyl.weight[i]*length.weight[j]*rad_cap.weight[m]*theta.weight[k]*phi.weight[l] 
    8773 
    88         if size > 1: 
    89             norm /= asin(1.0) 
    90  
     74        #if size > 1: 
     75         #   norm /= asin(1.0) 
     76        cl.enqueue_copy(queue, self.res, self.res_b) 
     77        sum += self.res 
    9178        if vol != 0.0 and norm_vol != 0.0: 
    9279            sum *= norm_vol/vol 
  • Models/code_coreshellcyl.py

    rca6c007 ra42fec0  
    66 
    77from weights import GaussianDispersion 
    8 from sasmodel import card 
    9  
    10  
    11 def set_precision(src, qx, qy, dtype): 
    12     qx = np.ascontiguousarray(qx, dtype=dtype) 
    13     qy = np.ascontiguousarray(qy, dtype=dtype) 
    14     if np.dtype(dtype) == np.dtype('float32'): 
    15         header = """\ 
    16 #define real float 
    17 """ 
    18     else: 
    19         header = """\ 
    20 #pragma OPENCL EXTENSION cl_khr_fp64: enable 
    21 #define real double 
    22 """ 
    23     return header+src, qx, qy 
     8from sasmodel import card, set_precision 
    249 
    2510class GpuCoreShellCylinder(object): 
     
    4631 
    4732        _ctx,queue = card() 
     33        self.res[:] = 0 
     34        cl.enqueue_copy(queue, self.res_b, self.res) 
    4835        radius, length, thickness, axis_phi, axis_theta = [GaussianDispersion(int(pars[base+'_pd_n']), pars[base+'_pd'], pars[base+'_pd_nsigma']) 
    4936                                     for base in GpuCoreShellCylinder.PD_PARS] 
     
    5643 
    5744        sum, norm, norm_vol, vol = 0.0, 0.0, 0.0, 0.0 
    58  
    59         print radius.value 
    60         print thickness.weight 
    61         print axis_phi.weight 
    62         print axis_theta.weight 
    63         print length.value 
    64  
    6545        size = len(axis_theta.weight) 
    6646 
     
    7959                                    real(pars['shell_sld']), real(pars['solvent_sld']),np.uint32(size), 
    8060                                    np.uint32(self.qx.size)) 
    81                             cl.enqueue_copy(queue, self.res, self.res_b) 
    82  
    83                             sum += self.res 
    8461                            vol += radius.weight[r]*length.weight[l]*thickness.weight[th]*pow(radius.value[r]+thickness.value[th],2)\ 
    8562                                   *(length.value[l]+2.0*thickness.value[th]) 
     
    9067        #if size>1: 
    9168         #   norm /= math.asin(1.0) 
     69        cl.enqueue_copy(queue, self.res, self.res_b) 
     70        sum = self.res 
    9271        if vol != 0.0 and norm_vol != 0.0: 
    9372            sum *= norm_vol/vol 
  • Models/code_cylinder.py

    rca6c007 ra42fec0  
    66 
    77from weights import GaussianDispersion 
    8 from sasmodel import card 
     8from sasmodel import card, set_precision, set_precision_1d 
    99 
    10  
    11 def set_precision(src, qx, qy, dtype): 
    12     qx = np.ascontiguousarray(qx, dtype=dtype) 
    13     qy = np.ascontiguousarray(qy, dtype=dtype) 
    14     if np.dtype(dtype) == np.dtype('float32'): 
    15         header = """\ 
    16 #define real float 
    17 """ 
    18     else: 
    19         header = """\ 
    20 #pragma OPENCL EXTENSION cl_khr_fp64: enable 
    21 #define real double 
    22 """ 
    23     return header+src, qx, qy 
    24  
    25 def set_precision_1d(src, q, dtype): 
    26     q = np.ascontiguousarray(q, dtype=dtype) 
    27     if np.dtype(dtype) == np.dtype('float32'): 
    28         header = """\ 
    29 #define real float 
    30 """ 
    31     else: 
    32         header = """\ 
    33 #pragma OPENCL EXTENSION cl_khr_fp64: enable 
    34 #define real double 
    35 """ 
    36     return header+src, q 
    3710 
    3811class GpuCylinder(object): 
     
    5528        self.qx_b = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qx) 
    5629        self.qy_b = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.qy) 
    57         self.res_b = cl.Buffer(ctx, mf.WRITE_ONLY, qx.nbytes) 
     30        self.res_b = cl.Buffer(ctx, cl.mem_flags.READ_WRITE, self.qx.nbytes) 
    5831        self.res = np.empty_like(self.qx) 
    5932 
     
    6134 
    6235        _ctx,queue = card() 
     36        self.res[:] = 0 
     37        cl.enqueue_copy(queue, self.res_b, self.res) 
    6338        radius, length, cyl_theta, cyl_phi = \ 
    6439            [GaussianDispersion(int(pars[base+'_pd_n']), pars[base+'_pd'], pars[base+'_pd_nsigma']) 
     
    6843        radius.value, radius.weight = radius.get_weights(pars['radius'], 0, 10000, True) 
    6944        length.value, length.weight = length.get_weights(pars['length'], 0, 10000, True) 
    70         cyl_theta.value, cyl_theta.weight = cyl_theta.get_weights(pars['cyl_theta'], -90, 180, False) 
    71         cyl_phi.value, cyl_phi.weight = cyl_phi.get_weights(pars['cyl_phi'], -90, 180, False) 
     45        cyl_theta.value, cyl_theta.weight = cyl_theta.get_weights(pars['cyl_theta'], -np.inf, np.inf, False) 
     46        cyl_phi.value, cyl_phi.weight = cyl_phi.get_weights(pars['cyl_phi'], -np.inf, np.inf, False) 
    7247 
    7348        #Perform the computation, with all weight points 
     
    8762                                           real(cyl_phi.weight[l]), real(cyl_theta.value[k]), real(cyl_phi.value[l]), 
    8863                                           np.uint32(self.qx.size), np.uint32(size)) 
    89                         cl.enqueue_copy(queue, self.res, self.res_b) 
    90                         sum += self.res 
     64 
    9165                        vol += radius.weight[i]*length.weight[j]*pow(radius.value[i], 2)*length.value[j] 
    9266                        norm_vol += radius.weight[i]*length.weight[j] 
     
    9569       # if size > 1: 
    9670        #    norm /= math.asin(1.0) 
     71        cl.enqueue_copy(queue, self.res, self.res_b) 
     72        sum = self.res 
    9773        if vol != 0.0 and norm_vol != 0.0: 
    9874            sum *= norm_vol/vol 
  • Models/code_ellipse.py

    rca6c007 ra42fec0  
    66 
    77from weights import GaussianDispersion 
    8 from sasmodel import card 
    9  
    10  
    11 def set_precision(src, qx, qy, dtype): 
    12     qx = np.ascontiguousarray(qx, dtype=dtype) 
    13     qy = np.ascontiguousarray(qy, dtype=dtype) 
    14     if np.dtype(dtype) == np.dtype('float32'): 
    15         header = """\ 
    16 #define real float 
    17 """ 
    18     else: 
    19         header = """\ 
    20 #pragma OPENCL EXTENSION cl_khr_fp64: enable 
    21 #define real double 
    22 """ 
    23     return header+src, qx, qy 
     8from sasmodel import card, set_precision 
    249 
    2510class GpuEllipse(object): 
     
    4631    #b_n = radius_b # want, a_n = radius_a # want, etc 
    4732        _ctx,queue = card() 
     33        self.res[:] = 0 
     34        cl.enqueue_copy(queue, self.res_b, self.res) 
    4835        radius_a, radius_b, axis_theta, axis_phi = \ 
    4936            [GaussianDispersion(int(pars[base+'_pd_n']), pars[base+'_pd'], pars[base+'_pd_nsigma']) 
     
    7663                                        real(axis_phi.value[l]), self.qx_b, self.qy_b, self.res_b, 
    7764                                        np.uint32(self.qx.size), np.uint32(len(axis_theta.weight))) 
    78                         #copy result back from buffer 
    79                         cl.enqueue_copy(queue, self.res, self.res_b) 
    80                         sum += self.res 
     65 
    8166                        vol += radius_a.weight[i]*radius_b.weight[j]*pow(radius_b.value[j], 2)*radius_a.value[i] 
    8267                        norm_vol += radius_a.weight[i]*radius_b.weight[j] 
     
    8873    #    if size > 1: 
    8974     #       norm /= math.asin(1.0) 
     75        cl.enqueue_copy(queue, self.res, self.res_b) 
     76        sum += self.res 
    9077        if vol != 0.0 and norm_vol != 0.0: 
    9178            sum *= norm_vol/vol 
  • Models/code_lamellar.py

    rca6c007 ra42fec0  
    55import pyopencl as cl 
    66from Models.weights import GaussianDispersion 
    7  
    8 def set_precision(src, qx, qy, dtype): 
    9     qx = np.ascontiguousarray(qx, dtype=dtype) 
    10     qy = np.ascontiguousarray(qy, dtype=dtype) 
    11     if dtype == 'double': 
    12         header = """\ 
    13 #define real float 
    14 """ 
    15     else: 
    16         header = """\ 
    17 #pragma OPENCL EXTENSION cl_khr_fp64: enable 
    18 #define real double 
    19 """ 
    20     return header+src, qx, qy 
     7from sasmodel import set_precision 
    218 
    229 
  • Models/code_triaxialellipse.py

    rca6c007 ra42fec0  
    66 
    77from weights import GaussianDispersion 
    8 from sasmodel import card 
    9  
    10  
    11 def set_precision(src, qx, qy, dtype): 
    12     qx = np.ascontiguousarray(qx, dtype=dtype) 
    13     qy = np.ascontiguousarray(qy, dtype=dtype) 
    14     if np.dtype(dtype) == np.dtype('float32'): 
    15         header = """\ 
    16 #define real float 
    17 """ 
    18     else: 
    19         header = """\ 
    20 #pragma OPENCL EXTENSION cl_khr_fp64: enable 
    21 #define real double 
    22 """ 
    23     return header+src, qx, qy 
     8from sasmodel import card, set_precision 
    249 
    2510class GpuTriEllipse: 
     
    4530 
    4631        _ctx,queue = card() 
     32        self.res[:] = 0 
     33        cl.enqueue_copy(queue, self.res_b, self.res) 
    4734        axisA, axisB, axisC, theta, phi, psi = \ 
    4835            [GaussianDispersion(int(pars[base+'_pd_n']), pars[base+'_pd'], pars[base+'_pd_nsigma']) 
     
    7259                                            real(axisA.weight[a]), real(axisB.weight[b]), real(axisC.weight[c]), real(psi.weight[s]), 
    7360                                            real(phi.weight[i]), real(theta.weight[t]), np.uint32(self.qx.size), np.uint32(size)) 
    74                                 cl.enqueue_copy(queue, self.res, self.res_b) 
    75                                 sum += self.res 
    7661 
    7762                                vol += axisA.weight[a]*axisB.weight[b]*axisC.weight[c]*axisA.value[a]*axisB.value[b]*axisC.value[c] 
     
    8166      #  if size > 1: 
    8267       #     norm /= asin(1.0) 
    83  
     68        cl.enqueue_copy(queue, self.res, self.res_b) 
     69        sum = self.res 
    8470        if vol != 0.0 and norm_vol != 0.0: 
    8571            sum *= norm_vol/vol 
  • Models/weights.py

    rdbb0048 ra42fec0  
    1919        sigma = width * center if relative else width 
    2020        if sigma == 0: 
    21             return np.array([center, 1.], 'd') 
     21            return np.array([center],'d'), np.array([1.], 'd') 
    2222        x = center + np.linspace(-nsigmas * sigma, +nsigmas * sigma, npts) 
    2323        x = x[(x >= min) & (x <= max)] 
Note: See TracChangeset for help on using the changeset viewer.