简体   繁体   中英

OpenMP shared vs. firstprivate performancewise

I have a #pragma omp parallel for loop inside a class method. Each thread readonly accesses few method local variables, few call private data and a method's parameter. All of them are declared in a shared clause. My questions:

  • Performance wise should not make any difference declare these variables shared or firstprivate . Right?
  • Is the same true if I'm not careful about making variable not sharing the same cache line?
  • If one of the shared variables is a pointer and inside the thread I read a value through it, is there an aliasing problem like in ordinary loops?

Tomorrow I will try to profile my code. In the meantime thanks for your advice!

  1. Well, they're not the same thing. With shared , they are shared between all the threads. With firstprivate , each thread gets it's own copy. If you're only reading the variable, then it's better to leave it as shared as to avoid copying it. (In C++, firstprivate will implicitly invoke the copy constructor.)

  2. Correct, multiple threads reading and writing to values that sit on the same cacheline is called false sharing . The cache line will bounce back and forth between the cores that are accessing it - which can result in significant slowdown if it happens often enough.

  3. If you're just reading data through the shared pointer, then there shouldn't be a problem. But if you're also writing to it, then you need to make sure you don't have a race condition.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM