The question about using OpenMP taskloop feature in gcc

Nan Xiao xiaonan830818@gmail.com
Tue Nov 21 09:24:00 GMT 2017


Hi Ruoyao,

I see. Thanks very much for your time and detailed explanation!
Best Regards
Nan Xiao


On Tue, Nov 21, 2017 at 4:56 PM, Xi Ruoyao <ryxi@stu.xidian.edu.cn> wrote:
> On 2017-11-21 16:50 +0800, Xi Ruoyao wrote:
>> On 2017-11-21 15:49 +0800, Nan Xiao wrote:
>> >
>> > #include <omp.h>
>> > #include <stdio.h>
>> >
>> > int main(void) {
>> >     #pragma omp parallel for
>> >     for (auto i = 0; i < 10; i++) {
>> >           int sum = 0;
>> >           #pragma omp taskloop shared(sum)
>> >           for (auto j = 0; j < 1000000; j++) {
>> >                  sum += j;
>> >            }
>> >            printf("%d\n", sum);
>> >      }
>> >      return 0;
>> > }
>>
>> There are two bugs in your code.  First, signed overflow is an undefined
>> behaviour and may generate arbitary result.  Second, the access to shared
>> variable sum is racing, the result may vary with scheduling.
>
> Fix:
>
>     #pragma omp parallel for
>     for (auto i = 0; i < 10; i++) {
>           long long sum = 0;
>           #pragma omp taskloop shared(sum)
>           for (auto j = 0; j < 1000000; j++) {
>                  __atomic_add_fetch(&sum, j, __ATOMIC_RELAXED);
>            }
>            printf("%lld\n", sum);
>     }
>
> This would generate "lock addq" instruction for "sum", instead of loading
> it into a register.
> --
> Xi Ruoyao <ryxi@stu.xidian.edu.cn>
> School of Aerospace Science and Technology, Xidian University



More information about the Gcc-help mailing list