<div dir="ltr"><div>Is there anything in the MPI standard preventing this sort of disgusting behavior?</div><div><br></div><div>/* user code increments evil once between every call to this function so that it should never fail in single-threaded execution */</div><div>static int evil = 0;</div>MPI_User_function(void* invec, void* inoutvec, int *len, MPI_Datatype *datatype)<div>{</div><div>  evil++;</div><div>  double * in = (double*)invec;</div><div>  double * out = (double*)inoutvec;<br></div><div>  if (*datatype == MPI_DOUBLE && (evil%2)==0) {</div><div>    for (int i=0; i<*len; i++) out[i] = evil*in[i];</div><div>  } else {</div><div>    MPI_Abort(1,MPI_COMM_WORLD);</div><div>  }</div><div>}<br><div><br class="">My goal is to illustrate a user-defined reduction that is not reentrant.  If you dislike my example, then please mentally replace it with a better one of your own creation :-)</div><div><br></div><div>The more general question is, are there any constraints on whether implementations may internally use multiple threads to call user-defined reductions?  I do not see any, but perhaps this is an oversight on my part.</div><div><br></div><div>Thanks,</div><div><br></div><div>Jeff</div><div><br></div>--<br>Jeff Hammond<br><a href="mailto:jeff.science@gmail.com" target="_blank">jeff.science@gmail.com</a><br><a href="http://jeffhammond.github.io/" target="_blank">http://jeffhammond.github.io/</a>
</div></div>