Add CBuilder.depends to automatically insert depending function.
This commit is contained in:
parent
c43b27356b
commit
fef9c2efbf
3 changed files with 33 additions and 13 deletions
|
|
@ -149,6 +149,13 @@ class CBuilder(object):
|
||||||
func = mod.add_function(functype, name=name)
|
func = mod.add_function(functype, name=name)
|
||||||
return CBuilder(func)
|
return CBuilder(func)
|
||||||
|
|
||||||
|
def depends(self, cdef, **kwargs):
|
||||||
|
try:
|
||||||
|
func = cdef.define(self.function.module, **kwargs)
|
||||||
|
except NameError as e:
|
||||||
|
(func,) = e
|
||||||
|
return CFunc(self, func)
|
||||||
|
|
||||||
def printf(self, fmt, *args):
|
def printf(self, fmt, *args):
|
||||||
mod = self.function.module
|
mod = self.function.module
|
||||||
int_t = lc.Type.int()
|
int_t = lc.Type.int()
|
||||||
|
|
@ -429,7 +436,7 @@ class CDefinition(CBuilder):
|
||||||
functype = lc.Type.function(cls._retty_, [v for k, v in cls._argtys_])
|
functype = lc.Type.function(cls._retty_, [v for k, v in cls._argtys_])
|
||||||
func = module.get_or_insert_function(functype, name=cls._name_)
|
func = module.get_or_insert_function(functype, name=cls._name_)
|
||||||
if not func.is_declaration: # already defined?
|
if not func.is_declaration: # already defined?
|
||||||
raise NameError('Function %s has already been defined' % cls._name_)
|
raise NameError(func)
|
||||||
|
|
||||||
# Name all arguments
|
# Name all arguments
|
||||||
for i, (name, _) in enumerate(cls._argtys_):
|
for i, (name, _) in enumerate(cls._argtys_):
|
||||||
|
|
|
||||||
|
|
@ -87,8 +87,15 @@ class Context(CStruct):
|
||||||
]
|
]
|
||||||
|
|
||||||
class ParallelUFunc(CDefinition):
|
class ParallelUFunc(CDefinition):
|
||||||
|
'''
|
||||||
|
Platform dependent threading function is implemented in
|
||||||
|
|
||||||
|
def _dispatch_worker(self, worker, contexts, num_thread):
|
||||||
|
...
|
||||||
|
|
||||||
|
which should be implemented in subclass or mixin.
|
||||||
|
'''
|
||||||
_name_ = 'parallel_ufunc'
|
_name_ = 'parallel_ufunc'
|
||||||
_retty_ = C.void
|
|
||||||
_argtys_ = [
|
_argtys_ = [
|
||||||
('func', C.void_p),
|
('func', C.void_p),
|
||||||
('worker', C.void_p),
|
('worker', C.void_p),
|
||||||
|
|
@ -182,13 +189,7 @@ class ParallelUFunc(CDefinition):
|
||||||
cur_ctxt.completed.assign(
|
cur_ctxt.completed.assign(
|
||||||
self.constant_null(cur_ctxt.completed.type))
|
self.constant_null(cur_ctxt.completed.type))
|
||||||
|
|
||||||
def _dispatch_worker(self, worker, contexts, num_thread):
|
class ParallelUFuncPosixMixin(object):
|
||||||
'''
|
|
||||||
Dispatch worker threads.
|
|
||||||
'''
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
class ParallelUFuncPosix(ParallelUFunc):
|
|
||||||
'''
|
'''
|
||||||
Implements _dispatch_worker to use pthread.
|
Implements _dispatch_worker to use pthread.
|
||||||
'''
|
'''
|
||||||
|
|
@ -316,6 +317,16 @@ class UFuncCore(CDefinition):
|
||||||
'''
|
'''
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
class _SpecializedParallelUFunc(ParallelUFunc, ParallelUFuncPosixMixin):
|
||||||
|
_argtys_ = [
|
||||||
|
('args', C.pointer(C.char_p)),
|
||||||
|
('dimensions', C.pointer(C.intp)),
|
||||||
|
('steps', C.pointer(C.intp)),
|
||||||
|
('data', C.void_p),
|
||||||
|
]
|
||||||
|
|
||||||
|
def body(self, args, dimensions, steps, data, ThreadCount=1):
|
||||||
|
pass
|
||||||
|
|
||||||
class PThreadAPI(CExternal):
|
class PThreadAPI(CExternal):
|
||||||
pthread_t = C.void_p
|
pthread_t = C.void_p
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@ class UFuncCore_D_D(UFuncCore):
|
||||||
res = ufunc_ptr(indata.load())
|
res = ufunc_ptr(indata.load())
|
||||||
outdata.store(res)
|
outdata.store(res)
|
||||||
|
|
||||||
|
class ParallelUFuncPosix(ParallelUFunc, ParallelUFuncPosixMixin):
|
||||||
|
pass
|
||||||
|
|
||||||
class Tester(CDefinition):
|
class Tester(CDefinition):
|
||||||
'''
|
'''
|
||||||
|
|
@ -45,10 +47,10 @@ class Tester(CDefinition):
|
||||||
ArgCount = 2
|
ArgCount = 2
|
||||||
WorkCount = 10000
|
WorkCount = 10000
|
||||||
|
|
||||||
parallel_ufunc = CFunc(self, ParallelUFuncPosix.define(module,
|
parallel_ufunc = self.depends(ParallelUFuncPosix,
|
||||||
ThreadCount=ThreadCount))
|
ThreadCount=ThreadCount)
|
||||||
ufunc_core = CFunc(self, UFuncCore_D_D.define(module))
|
ufunc_core = self.depends(UFuncCore_D_D)
|
||||||
worker = CFunc(self, Work_D_D.define(module))
|
worker = self.depends(Work_D_D)
|
||||||
|
|
||||||
# real work
|
# real work
|
||||||
NULL = self.constant_null(C.void_p)
|
NULL = self.constant_null(C.void_p)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue