Skip to content

Commit ae74a7c

Browse files
committed
Avoid using thread_local to work-around mingw bug
1 parent daa8bb1 commit ae74a7c

File tree

1 file changed

+10
-26
lines changed

1 file changed

+10
-26
lines changed

pocketfft_hdronly.h

+10-26
Original file line numberDiff line numberDiff line change
@@ -515,25 +515,12 @@ namespace threading {
515515

516516
#ifdef POCKETFFT_NO_MULTITHREADING
517517

518-
constexpr inline size_t thread_id() { return 0; }
519-
constexpr inline size_t num_threads() { return 1; }
520-
521518
template <typename Func>
522519
void thread_map(size_t /* nthreads */, Func f)
523520
{ f(); }
524521

525522
#else
526523

527-
inline size_t &thread_id()
528-
{
529-
static thread_local size_t thread_id_=0;
530-
return thread_id_;
531-
}
532-
inline size_t &num_threads()
533-
{
534-
static thread_local size_t num_threads_=1;
535-
return num_threads_;
536-
}
537524
static const size_t max_threads = std::max(1u, std::thread::hardware_concurrency());
538525

539526
class latch
@@ -786,7 +773,7 @@ void thread_map(size_t nthreads, Func f)
786773
nthreads = max_threads;
787774

788775
if (nthreads == 1)
789-
{ f(); return; }
776+
{ f(0, 1); return; }
790777

791778
auto & pool = get_pool();
792779
latch counter(nthreads);
@@ -796,9 +783,7 @@ void thread_map(size_t nthreads, Func f)
796783
{
797784
pool.submit(
798785
[&f, &counter, &ex, &ex_mut, i, nthreads] {
799-
thread_id() = i;
800-
num_threads() = nthreads;
801-
try { f(); }
786+
try { f(i, nthreads); }
802787
catch (...)
803788
{
804789
std::lock_guard<std::mutex> lock(ex_mut);
@@ -2881,15 +2866,14 @@ template<size_t N> class multi_iter
28812866
}
28822867

28832868
public:
2884-
multi_iter(const arr_info &iarr_, const arr_info &oarr_, size_t idim_)
2869+
multi_iter(const arr_info &iarr_, const arr_info &oarr_, size_t idim_,
2870+
size_t nshares, size_t myshare)
28852871
: pos(iarr_.ndim(), 0), iarr(iarr_), oarr(oarr_), p_ii(0),
28862872
str_i(iarr.stride(idim_)), p_oi(0), str_o(oarr.stride(idim_)),
28872873
idim(idim_), rem(iarr.size()/iarr.shape(idim))
28882874
{
2889-
auto nshares = threading::num_threads();
28902875
if (nshares==1) return;
28912876
if (nshares==0) throw std::runtime_error("can't run with zero threads");
2892-
auto myshare = threading::thread_id();
28932877
if (myshare>=nshares) throw std::runtime_error("impossible share requested");
28942878
size_t nbase = rem/nshares;
28952879
size_t additional = rem%nshares;
@@ -3134,11 +3118,11 @@ POCKETFFT_NOINLINE void general_nd(const cndarr<T> &in, ndarr<T> &out,
31343118

31353119
threading::thread_map(
31363120
util::thread_count(nthreads, in.shape(), axes[iax], VLEN<T>::val),
3137-
[&] {
3121+
[&] (size_t tid, size_t nthreads) {
31383122
constexpr auto vlen = VLEN<T0>::val;
31393123
auto storage = alloc_tmp<T0>(in.shape(), len, sizeof(T));
31403124
const auto &tin(iax==0? in : out);
3141-
multi_iter<vlen> it(tin, out, axes[iax]);
3125+
multi_iter<vlen> it(tin, out, axes[iax], nthreads, tid);
31423126
#ifndef POCKETFFT_NO_VECTORS
31433127
if (vlen>1)
31443128
while (it.remaining()>=vlen)
@@ -3241,10 +3225,10 @@ template<typename T> POCKETFFT_NOINLINE void general_r2c(
32413225
size_t len=in.shape(axis);
32423226
threading::thread_map(
32433227
util::thread_count(nthreads, in.shape(), axis, VLEN<T>::val),
3244-
[&] {
3228+
[&] (size_t tid, size_t nthreads) {
32453229
constexpr auto vlen = VLEN<T>::val;
32463230
auto storage = alloc_tmp<T>(in.shape(), len, sizeof(T));
3247-
multi_iter<vlen> it(in, out, axis);
3231+
multi_iter<vlen> it(in, out, axis, nthreads, tid);
32483232
#ifndef POCKETFFT_NO_VECTORS
32493233
if (vlen>1)
32503234
while (it.remaining()>=vlen)
@@ -3296,10 +3280,10 @@ template<typename T> POCKETFFT_NOINLINE void general_c2r(
32963280
size_t len=out.shape(axis);
32973281
threading::thread_map(
32983282
util::thread_count(nthreads, in.shape(), axis, VLEN<T>::val),
3299-
[&] {
3283+
[&] (size_t tid, size_t nthreads) {
33003284
constexpr auto vlen = VLEN<T>::val;
33013285
auto storage = alloc_tmp<T>(out.shape(), len, sizeof(T));
3302-
multi_iter<vlen> it(in, out, axis);
3286+
multi_iter<vlen> it(in, out, axis, nthreads, tid);
33033287
#ifndef POCKETFFT_NO_VECTORS
33043288
if (vlen>1)
33053289
while (it.remaining()>=vlen)

0 commit comments

Comments
 (0)