|Re: [eigen] Help on solving a race condition|
[ Thread Index |
| More lists.tuxfamily.org/eigen Archives
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] Help on solving a race condition
- From: Gael Guennebaud <gael.guennebaud@xxxxxxxxx>
- Date: Fri, 8 Jun 2012 17:37:34 +0200
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type:content-transfer-encoding; bh=5X4EQo1pgx22Ws9KX1nAYBGe/KD3Ny+RY6P3Fs/OKpU=; b=fb9gFXbtDDLQLMqrZAooL+Saj9WFY/kr29yiBy7T5Kn78fBUFRmytlBSdb91C6rWfE KI8ImNrPMf8mb463QmIp5Or6KEeyTnnE8PektdEePaIjDsUo2LlS8u3UF6JRImnpjyDU 9umTLXSpdHpPB3eqtWebKYwRvUxuQZjK99a4hQ04QdjtAn1AdYQEm/EPTLDwNYcsXzYp QS/iGEhmZ09Noe9tUeKUbEpA+y6/irY2r6x8hitCj3vQ9OShFGs9fTFeKNRWdtsl7GT1 JieVq3dUmXS1oLiWHwpWy2gRL8DHR7PAHACsLX528gK//Ts5Z8yLEew5/S2wcs2z/ZfG hu0A==
On Fri, Jun 8, 2012 at 5:32 PM, Brad Bell <bradbell@xxxxxxxxxx> wrote:
> This solution is openmp specific; what if someone wants to use pthreads or
> some other threading system ?
Very good point!
Then I guess the only safe and clean solution is to request users to
call a Eigen::init_parallel() or something.
> On 06/08/2012 07:24 AM, Hauke Heibel wrote:
>> Hi Gael,
>> I think the most efficient solution would be to use atomics. I am not
>> sure whether the code below is allowed and fixes the problem
>> #pragma omp atomic
>> static std::ptrdiff_t m_l1CacheSize =
>> manage_caching_sizes_helper(queryL1CacheSize(),8 * 1024);
>> #pragma omp atomic
>> static std::ptrdiff_t m_l2CacheSize =
>> Another alternative might be #pragma omp critical.
>> Yet another idea might be to look at 'atomic_do_once' (see  and
>> ) from Intel's TBB. The code from  probably gets much simpler
>> for the use case at hand because the cache size itself could be stored
>> as an atomic.
>> On Fri, Jun 8, 2012 at 3:12 PM, Gael Guennebaud
>> <gael.guennebaud@xxxxxxxxx> wrote:
>>> I'm looking for some help on understanding how the following piece of
>>> code in Eigen can lead to a race condition when the function
>>> manage_caching_sizes is called from different threads:
>>> inline std::ptrdiff_t manage_caching_sizes_helper(std::ptrdiff_t a,
>>> std::ptrdiff_t b)
>>> return a<=0 ? b : a;
>>> inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1=0,
>>> std::ptrdiff_t* l2=0)
>>> static std::ptrdiff_t m_l1CacheSize =
>>> manage_caching_sizes_helper(queryL1CacheSize(),8 * 1024);
>>> static std::ptrdiff_t m_l2CacheSize =
>>> During it's first call, this function computes and store the cache sizes.
>>> I would like to find a solution that avoids making the static variable
>>> "thread private" as suggested there:
>>> The problem with this approach, is that the cache-sizes are recomputed
>>> for every thread.