SPI openmp parallel critical
François Deliège
fdeliege at gmail.com
Thu Apr 2 04:16:11 PDT 2009
Hi list,
I am writing a C user defined function that is loading values obtained from
an SPI table and that has to perform some operation on each of these
values. The values are binary and have a variable size. Since CPU is a
bottleneck and since I have multiple cores, I would like the operations to
be performed in parallel. Everything goes fine if I define as a critical
segment the part where I get the data from tuptable.
However, if I remove the critical section I get this error:
ERROR: lock 53 is not held
I don't always get the error, but it always crashes if I start to have a few
values in the SPI table.
I would like to eliminate that critical section. Any advice ?
I guess someone else already ran in this kind of problem. :-)
SPI_connect();
ret = SPI_execute(command, 1, 0);
proc = SPI_processed;
#pragma omp parallel for shared(proc, SPI_tuptable ) private( mydata,
isnull)
for (j = 0; j < proc; j++) {
// returns datum from the first element
#pragma omp critical // would like to eliminate this
{ mydata = (mydatatype
*)PG_DETOAST_DATUM(SPI_getbinval(SPI_tuptable->vals[j],
SPI_tuptable->tupdesc, 1, &isnull)); }
... // do something with mydata
}
SPI_finish();
Cheers,
Francois
More information about the freebsd-threads
mailing list