C/C++ Parallel processing for loops and pointer defined outside the loop

AI Thread Summary
The discussion revolves around the use of integer pointers in OpenMP for parallel processing. A user inquires about the possibility of defining an integer pointer outside a for loop and making it private for threads during parallel execution. It is clarified that if a pointer is declared as private, each thread will have its own pointer pointing to random memory locations, while declaring it as firstprivate allows all threads to share the same memory address, although each has its own pointer. The conversation also touches on the implications of using break or goto statements within nested loops when only the outer loop is parallelized, with the consensus that such practices can lead to poor performance and are generally discouraged. The importance of understanding the structure and purpose of parallelization in OpenMP is emphasized, as well as the need for clarity in coding practices to achieve efficient parallel performance.
mertcan
Messages
343
Reaction score
6
Hi everyone; hope you are well. I have a small question: As far as I have searched, for example we can make integer variable defined outside the for loop private for multiple threads, but is it also possible to apply this situation for an integer pointer defined outside the for loop? I mean if a integer pointer have defined outside the for loop, which is gonna be processed with multi thread, then can we make that pointer private for threads? (I am using visual studio 2022 community and include <omp> structures)
 
Last edited:
Technology news on Phys.org
So you want a variable that is local to a loop accessible outside the loop (and indeed outside the process)? Why do you need one that is simultaneously local and not-local?
 
Not sure what you are asking, but it sounds like you might want a variable with thread local storage class (this one is for C++11, similar construct is available is many other languages). Not sure how that relates to OMP though.
 
Vanadium 50 said:
So you want a variable that is local to a loop accessible outside the loop (and indeed outside the process)? Why do you need one that is simultaneously local and not-local?
Thank you for your kind return, I asked because I try to comprehend the structure behind OMP for my project. Whenever I see, during the privatization for "for loop", an integer or double variable examples take place. I have not see an integer pointer example for privatization. So, is it possible to define a pointer in main function but privatize it just before the parallel processing of for loop?
 
I don't understand what you wrote - if you are using an auto-translator, you might want to try a different one.

If your loop is changing the value of a variable, reading the contents of that variable outside the loop is undefined. If the loop is not changing the value of the variable, it should be defined and scoped outside that loop.
 
mertcan said:
Thank you for your kind return, I asked because I try to comprehend the structure behind OMP for my project. Whenever I see, during the privatization for "for loop", an integer or double variable examples take place. I have not see an integer pointer example for privatization. So, is it possible to define a pointer in main function but privatize it just before the parallel processing of for loop?
If you simply declare the pointer as private, each thread will have its own pointer, but that pointer will point to a random place in memory. If you declare it as firstprivate, the address pointed to will be the same for all thread, i.e., each thread will have its own pointer, put all those pointer point to the same location (so that memory location will not be private).
 
Vanadium 50 said:
I don't understand what you wrote - if you are using an auto-translator, you might want to try a different one.

If your loop is changing the value of a variable, reading the contents of that variable outside the loop is undefined. If the loop is not changing the value of the variable, it should be defined and scoped outside that loop.
Thank you for your nice answer.
 
DrClaude said:
If you simply declare the pointer as private, each thread will have its own pointer, but that pointer will point to a random place in memory. If you declare it as firstprivate, the address pointed to will be the same for all thread, i.e., each thread will have its own pointer, put all those pointer point to the same location (so that memory location will not be private).
Thank you DrClaude for your explanatory and kind return. Please correct me if I understand wrong: lets say we have created a pointer using "new" outside the parallel for loop, and you say during the privatization (without firstprivate) of that pointer, each thread will create that pointer regarding random place in memory. But pointers are created by "new" function, so the other threads use the "new" function that we have just employed above?
 
mertcan said:
Thank you DrClaude for your explanatory and kind return. Please correct me if I understand wrong: lets say we have created a pointer using "new" outside the parallel for loop, and you say during the privatization (without firstprivate) of that pointer, each thread will create that pointer regarding random place in memory. But pointers are created by "new" function, so the other threads use the "new" function that we have just employed above?
Yes, each thread will create a new instance of the pointer.
 
  • #10
Thank you @DrClaude for your valuable return. May I ask a small question related to for loop during parallelization: Lets say we have a nested for loops consisting of 2 for loops (as you know OpenMP does not allow break or goto statements if the loop is parallelized) so if we just parallelize the outer loop, then we can use "break, goto" statements during the inner loop?
 
  • #11
PF is probably not the best resource for learning OpenMP from scratch, especially without seeing your source code or a description of the problem.

If you want to see what your code is actually doing, as opposed to what you think it is oir should be, print omp_get_thread_n.

If you want efficient code, you should use the OMP "collapse" directive. That will preclude jumping out of loops - which is usually not best practice anyway.
 
  • #12
mertcan said:
Lets say we have a nested for loops consisting of 2 for loops (as you know OpenMP does not allow break or goto statements if the loop is parallelized) so if we just parallelize the outer loop, then we can use "break, goto" statements during the inner loop?
I don't see a problem with breaking out of the inner loop or using a goto if the label it goes to is inside the outer loop. The reason you can't break out of a loop is that it is a linear process (it will stop the loop at a given value of the loop variable) that can't be parallelized.
 
  • Like
Likes Vanadium 50
  • #13
DrClaude said:
I don't see a problem with breaking out of the inner loop or using a goto if the label it goes to is inside the outer loop.
Except that it will then only parallelize the outer loop. Usually this gives terrible performance.

Branches within parallel blocks are bad. Gotos and breaks are rarely what you want. Combing the two is a bad idea, especially for novices.
 
  • #14
Thhis is the trouble with "objectified C". If you want to do this in C, you would put this code in a separate module and declare the pointer as "static" (which means that only code in that module can access it).
 
  • #15
The OP seems to have gone, but I don't think he is likely to get good coding advice without some details. Why he wants a pointer (and he is unclear as to its scope) and the ability to break out of a loop is unclear.

If you want decent parallel performance, the 1st step is to clearly think about exactly what you are trying to do. This goes double for OpenMP. I've seen people littering their code with pragma omp statements and all they are doing is making a mess.

Its probably also worth pointing out the not all parallelism is created equal. If I want to go fropm a single threaded program to one that runs with two threads, that's a different kettle of fish than a GPU which could have hundreds.
 

Similar threads

Back
Top