intel / yarpgen

Yet Another Random Program Generator
Other
490 stars 53 forks source link

yarpgen support pragma omp simd #202

Open huangcj123456 opened 1 month ago

huangcj123456 commented 1 month ago

I used the Yargen tool and found a bug in the tool.

wrong code: void test(int acc, int inc) {

pragma omp simd

for (int i = 0; i < 16; i++) acc += inc; }

OK code: void test(int acc, int inc) {

pragma omp simd reduction(+:acc[0])

for (int i = 0; i < 16; i++) acc += inc; } The absence of the "reduction" keyword leads to undefined behavior in this test case.

Who knows how to solve this problem?

dbabokin commented 1 month ago

Could you please elaborate why is this UB? I'm not an expert in OpenMP, so pointers to standard would help.

huangcj123456 commented 1 month ago

SIMD Reduction:

pragma omp for simd reduction(+:local_sum) is applied to the loop. This tells the compiler to vectorize the loop and also to perform a reduction operation on local_sum across different iterations assigned to different threads.

The reduction is done with the addition operator +, which combines local_sum from all threads into the final result.

dbabokin commented 1 month ago

But why is it UB without reduction?