<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/54216>54216</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
OpenMP Offload: Race condition when mapping produce incorect values
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
TApplencourt
</td>
</tr>
</table>
<pre>
Hi,
The code below gives incorrect results:
```
#include <iostream>
#include <cstdlib>
#include <algorithm>
bool almost_equal(float x, float gold, float rel_tol=1e-09, float abs_tol=0.0) {
return std::abs(x-gold) <= std::max(rel_tol * std::max(std::abs(x), std::abs(gold)), abs_tol);
}
void test_parallel_for__target() {
const int N0 { 32768 };
const float expected_value { N0 };
float counter_N0{};
#pragma omp parallel for
for (int i0 = 0 ; i0 < N0 ; i0++ )
{
#pragma omp target map(tofrom: counter_N0)
{
#pragma omp atomic update
counter_N0 = counter_N0 + 1. ;
}
}
if (!almost_equal(counter_N0, expected_value, 0.01)) {
std::cerr << "Expected: " << expected_value << " Got: " << counter_N0 << std::endl;
std::exit(112);
}
}
int main()
{
test_parallel_for__target();
}
```
By the OpenMP spec, the code is race free. I don't know if I can reproduce here the email exchange that happened between Michael Kruse and Bronis de Supinski in the OpenMP Mail list (Title of the email thread `[Omp-lang] Race conditions with target mapping tasks`), but the gist is:
- In OpenMP `map` are considered to be performed atomicaly
- Hence, no race condition in the code, just an undefined amount of data copy
Hope this help,
Don't hesitate if you have other question
PS: Because this code is a race condition, sometime it work, just tests it until it fail :)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyFVtuOozgQ_RryUkpETNLpPOQhl5nt1qqnRzv9HjlgwNMGM7bpy9_vsQkJYXc0EiK2q3zqdqrISWefmwcZsX0UH6J4271fSkGpzgSdhNLvVMg3YUnWqTZGpI6MsK1yNkq2w0vRXXx-ui1LcEO1QImSvdTWGcGrKPnyf-LUukzJ02-kXBXaSFdeb5-0VsRVBdSj-NVyFbH7XGnu6AOhULcstMquOyPU0WkVJYe5mMbrq4Cf7FkQz-KIrSla7TorhEuuNTXBOx9ssoUuLH1MO-i1dw73rvKKw_792RRFbDsWjZEA4j0ZHZ_hz8LeQeySs2fR6tAt3rTMyAmkoeGGKwXLuTbHo-OmEA5Qo4BSXVuHUjr6FvtzStjq7p48XjJS6rIjPhqUXGTHN65aEa6Em0P9TjPVbe2EOX6Lvb0bBZSzMbyoOOmqod5TgqcXCG2gde8dk4BHTv171232wWTYRWyHh3wueuxrcGNDXRKo4g2gnc6NBoO2Q0evMCOgMRR3upIptU3GnRiqXcGC18Mt_JzPaJAGokvdbpYyp1Cp-YjRQ0f3o0r4E_B13tHk1vkLm1JhTMfRPSywL2cEnwRse8m4xBd9-ku7ke5NuOHkYkzUmboJ9ir5kJ6K8zkbcniQgsvC17_isu6I2wsHmH-g-n8bZDyVwnv3SQ4j7rkR9dN3sgjfp9P1U09aMjwVlBshZvRImYZDK0evNYYhivVIKa8xGxqjsxZ6pTAi3BbwXSGfacnrwh-hLUrewIzIMEvduxA1PUmIwf6_TWsF8TqjndE1bMLyj7aRtX2V6NChh08eVkk0JcJ8kU4J0vnAoisxWzPyUS53z1UzVbAfLQ_0jw8D7ZxJJ9HU9I4pOmgLGCuwta_WX-2mzal1Abnw5uR1yE_pse79gbZvqruYuAn4VmbIASaRRpjUCIPKVNh3bcPVZ4_xIOo0cLfWXY4vzvUh-wp4hZ8t7CPNbZ2JXPoE8sqTz0eOJuRQbD6HRX3QjU85ElkK1Vy-aIdz8UphpUPz-gJ-6hZ1eUMWYdHQrxasggtDtO8_PPN3IuW-SgG25wYfeR4GuK6EkxXkjt61eb1E4Alr_SlcR6WwyH3FfFrRtpNsk2TrZM0nzld1c87vc-5HaujT2wrSewkG9ZXr-Re-zP7DHBrYTlqjNqVzTSge-4qnQN3b0yzFAGRflXrrf6aA-Imb2EprcReL5YLN7yblZhUnfLmYL9PVImFJcr9enfhinfM4TdK7bJlPFMffA7sB5TAgaoHW8BBYg3kTuWExY3ESLxibLxfrGTsxJlg6zxY5S9NFEi3iQN6Z92OmTTExm-DSqS0shJ7u9irk1sqiFiKYAz5vXanN5mXbNAqc0q1xk2B_E_z_Fy4lryA">