Changeset f2f67a6 in sasmodels for sasmodels/generate.py


Ignore:
Timestamp:
Apr 15, 2016 5:26:24 PM (8 years ago)
Author:
Paul Kienzle <pkienzle@…>
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:
ae2b6b5, 38a9b07, eb97b11
Parents:
0ff62d4
Message:

reenable opencl; works on cpu but not gpu

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/generate.py

    ra5b8477 rf2f67a6  
    173173 
    174174try: 
    175     from typing import Tuple, Sequence, Iterator 
     175    from typing import Tuple, Sequence, Iterator, Dict 
    176176    from .modelinfo import ModelInfo 
    177177except ImportError: 
     
    298298    Return a timestamp for the model corresponding to the most recently 
    299299    changed file or dependency. 
     300 
     301    Note that this does not look at the time stamps for the OpenCL header 
     302    information since that need not trigger a recompile of the DLL. 
    300303    """ 
    301304    source_files = (model_sources(model_info) 
     
    304307    newest = max(getmtime(f) for f in source_files) 
    305308    return newest 
     309 
     310def model_templates(): 
     311    # type: () -> List[str] 
     312    # TODO: fails DRY; templates appear two places. 
     313    # should instead have model_info contain a list of paths 
     314    # Note: kernel_iq.cl is not on this list because changing it need not 
     315    # trigger a recompile of the dll. 
     316    return [joinpath(TEMPLATE_ROOT, filename) 
     317            for filename in ('kernel_header.c', 'kernel_iq.c')] 
    306318 
    307319def convert_type(source, dtype): 
     
    377389    return _template_cache[filename][1] 
    378390 
    379 def model_templates(): 
    380     # type: () -> List[str] 
    381     # TODO: fails DRY; templates are listed in two places. 
    382     # should instead have model_info contain a list of paths 
    383     return [joinpath(TEMPLATE_ROOT, filename) 
    384             for filename in ('kernel_header.c', 'kernel_iq.c')] 
    385  
    386391 
    387392_FN_TEMPLATE = """\ 
     
    390395    %(body)s 
    391396} 
    392  
    393397 
    394398""" 
     
    467471    # Load templates and user code 
    468472    kernel_header = load_template('kernel_header.c') 
    469     kernel_code = load_template('kernel_iq.c') 
     473    dll_code = load_template('kernel_iq.c') 
     474    ocl_code = load_template('kernel_iq.cl') 
    470475    user_code = [open(f).read() for f in model_sources(model_info)] 
    471476 
     
    506511    if _have_Iqxy(user_code): 
    507512        # Call 2D model 
    508         refs = ["q[2*i]", "q[2*i+1]"] + _call_pars("_v.", partable.iqxy_parameters) 
     513        refs = ["q[2*_i]", "q[2*_i+1]"] + _call_pars("_v.", partable.iqxy_parameters) 
    509514        call_iqxy = "#define CALL_IQ(_q,_i,_v) Iqxy(%s)" % (",".join(refs)) 
    510515    else: 
     
    521526    # TODO: allow mixed python/opencl kernels? 
    522527 
    523     # define the Iq kernel 
    524     source.append("#define KERNEL_NAME %s_Iq"%model_info.name) 
    525     source.append(call_iq) 
    526     source.append(kernel_code) 
    527     source.append("#undef CALL_IQ") 
    528     source.append("#undef KERNEL_NAME") 
    529  
    530     # define the Iqxy kernel from the same source with different #defines 
    531     source.append("#define KERNEL_NAME %s_Iqxy"%model_info.name) 
    532     source.append(call_iqxy) 
    533     source.append(kernel_code) 
    534     source.append("#undef CALL_IQ") 
    535     source.append("#undef KERNEL_NAME") 
    536  
     528    source.append("#if defined(USE_OPENCL)") 
     529    source.extend(_add_kernels(ocl_code, call_iq, call_iqxy, model_info.name)) 
     530    source.append("#else /* !USE_OPENCL */") 
     531    source.extend(_add_kernels(dll_code, call_iq, call_iqxy, model_info.name)) 
     532    source.append("#endif /* !USE_OPENCL */") 
    537533    return '\n'.join(source) 
     534 
     535def _add_kernels(kernel_code, call_iq, call_iqxy, name): 
     536    # type: (str, str, str, str) -> List[str] 
     537    source = [ 
     538        # define the Iq kernel 
     539        "#define KERNEL_NAME %s_Iq"%name, 
     540        call_iq, 
     541        kernel_code, 
     542        "#undef CALL_IQ", 
     543        "#undef KERNEL_NAME", 
     544 
     545        # define the Iqxy kernel from the same source with different #defines 
     546        "#define KERNEL_NAME %s_Iqxy"%name, 
     547        call_iqxy, 
     548        kernel_code, 
     549        "#undef CALL_IQ", 
     550        "#undef KERNEL_NAME", 
     551    ] 
     552    return source 
    538553 
    539554def load_kernel_module(model_name): 
    540555    # type: (str) -> module 
     556    """ 
     557    Return the kernel module named in *model_name*. 
     558 
     559    If the name ends in *.py* then load it as a custom model using 
     560    :func:`sasmodels.custom.load_custom_kernel_module`, otherwise 
     561    load it from :mod:`sasmodels.models`. 
     562    """ 
    541563    if model_name.endswith('.py'): 
    542564        kernel_module = load_custom_kernel_module(model_name) 
Note: See TracChangeset for help on using the changeset viewer.