<br><br><div class="gmail_quote">On Tue, Jan 15, 2013 at 2:14 PM, Jed Brown <span dir="ltr"><<a href="mailto:jedbrown@mcs.anl.gov" target="_blank">jedbrown@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr"><div class="im">On Tue, Jan 15, 2013 at 1:50 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br></div><div class="gmail_extra">

<div class="gmail_quote"><div class="im">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
  Do we really want mallocs for EVERY single multiple-dispatch function call in PETSc? I suggest not having MatQueryOp() but calling directly PetscOpFListFind() (with the MatOpFList argument) and changing PetscOpFListAdd/Find() to use variable args directly.<br>



<br>
   Finally do we really want string comparisons at all here? Or do we want XXXRegister() (for example, MatRegister()) to compute an integer type id to go with each char *type_name and do the search off the integer type id instead of strings? Thus making PetscOpFListFind() super light weight?<br>


</blockquote><div><br></div></div><div>static struct {</div><div>  PetscMultiDispatch ptap;</div><div>  ...</div><div>} MatMultiDispatch;</div><div><br></div><div>I would have PetscMultiDispatchRegister("MatPtAP",2,&MatMultiDispatch.ptap), then<br>


<br></div><div>PetscMultiDispatchFind(MatMultiDispatch.ptap,(PetscObject)A,(PetscObject)P,&ptapfunc);</div><div><br></div><div>I think passing PetscObject is natural here, in which case using obj->type_id instead of obj->type_name can be done later. But on that front, yes, I think making integers for all registered type_names would be good. Among other things, it would make the PetscObjectTypeCompares fast, although I think those places should eventually be refactored.</div>

</div></div></div></blockquote><div>Some of the arguments aren't PetscObjects (e.g., PODs).</div><div>Each dispatcher (e.g., MatMultMult) can have static integer typeids for all of its arguments that are registered</div>

<div>or retrieved only on the first invocation and reused from then on.</div><div><br></div><div>Dmitry. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">

<div class="gmail_extra"><div class="gmail_quote"><div class="im">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
   Barry<br>
<br>
<br>
PetscErrorCode  MatQueryOp(MPI_Comm comm, PetscVoidFunction* function, const char op[], PetscInt numArgs, ...)<br>
{<br>
  PetscErrorCode ierr;<br>
  va_list        ap;<br>
  PetscInt       i;<br>
  const char     *argType;<br>
  char           **argTypes = PETSC_NULL;<br>
<br>
  PetscFunctionBegin;<br>
  va_start(ap,numArgs);<br>
  if (numArgs) {<br>
    ierr = PetscMalloc(sizeof(char*)*numArgs, &argTypes);CHKERRQ(ierr);<br>
  }<br>
  for (i = 0; i < numArgs; ++i) {<br>
    argType = va_arg(ap,const char*);<br>
    ierr = PetscStrallocpy(argType, argTypes+i);CHKERRQ(ierr);<br>
  }<br>
  va_end(ap);<br>
  ierr = PetscOpFListFind(comm, MatOpList, function, op, numArgs, argTypes);CHKERRQ(ierr);<br>
  for (i = 0; i < numArgs; ++i) {<br>
    ierr = PetscFree(argTypes[i]);CHKERRQ(ierr);<br>
  }<br>
  ierr = PetscFree(argTypes);CHKERRQ(ierr);<br>
  PetscFunctionReturn(0);<br>
}<br>
<br>
</blockquote></div></div><br></div></div>
</blockquote></div><br><br clear="all"><div><br></div>