[Omp] Working with threadprivate elements of structs

Churbanov, Andrey Andrey.Churbanov at intel.com
Tue Jan 13 09:27:39 PST 2004


Clay,
 
One note. Be aware that your suggestion should work only if dynamic
threads mechanism is disabled
and the number of threads is not changed explicitly between parallel
regions.
Otherwise you may get undefined results.
 
- Andrey
 

	-----Original Message-----
	From: Omp-bounces at openmp.org [mailto:Omp-bounces at openmp.org] On
Behalf Of Breshears, Clay
	Sent: Tuesday, January 13, 2004 7:56 PM
	To: Shah, Sanjiv; omp at openmp.org
	Subject: RE: [Omp] Working with threadprivate elements of
structs
	
	
	Sanjiv -
	 
	Okay, that make sense.  If I initialized the static_ltree with a
static initializer, used a NULL in the l_desc initialization, and then
stored the address of static_ltree in l_desc within a parallel region,
would this set up the correct address and threadprivates that I need? 
	 
	Example code:
	 
	ct_data static_ltree[100] = { {0,0} };  //init one element to
force use?

	#pragma omp threadprivate (static_ltree)

	typedef struct tree_desc { 
	   ct_data *tree; 
	   int max_length; 
	   int max_code; 
	} tree_desc; 

	tree_desc l_desc = {NULL, MAX_LEN, 0}; 

	#pragma omp threadprivate (l_desc)

	 

	#pragma omp parallel   
	   l_desc.tree = static_ltree;   //threadprivate address into
threadprivate?
	

		-----Original Message-----
		From: Shah, Sanjiv 
		Sent: Friday, January 09, 2004 6:12 PM
		To: Breshears, Clay; omp at openmp.org
		Subject: RE: [Omp] Working with threadprivate elements
of structs
		
		
		Clay,
		 
		Addresses of threadprivate objects are not constant, so
as soon as you make static_ltree threadprivate, you will not be able to
use it in the structure initialization for l_desc.  You will have to
initialize the tree field with NULL and then use a dummy parallel
region, as you suggest, to set up the correct linkages.  The code should
be just a simple assignment in the parallel region.
		 
		Sanjiv
		 

		-- 
		Sanjiv, 217-403-4244 

		 

  _____  

		From: Omp-bounces at openmp.org
[mailto:Omp-bounces at openmp.org] On Behalf Of Breshears, Clay
		Sent: Friday, January 09, 2004 5:45 PM
		To: omp at openmp.org
		Subject: [Omp] Working with threadprivate elements of
structs
		
		


		I need to have a threadprivate array that is pointed to
by a threadprivate struct.  How do I declare and initialize these so
they all refer to the correct versions?

		In a C code, I have an array that needs to be
threadprivate.  The original serial code also includes a struct (used as
a descriptor to carry additional information about the array and its
contents) that is also used as a parameter to some function calls.  The
fields of the descriptor instances are statically initialized at
declaration time.  For example, the serial code looks something like:

		ct_data static_ltree[100]; 

		typedef struct tree_desc { 
		   ct_data *tree; 
		   int max_length; 
		   int max_code; 
		} tree_desc; 

		tree_desc l_desc = {static_ltree, MAX_LEN, 0}; 

		If I put in pragmas to set static_ltree and l_desc to be
threadprivate, how can I guarantee that each thread's copy of
static_ltree will be pointed to by that same thread's copy of l_desc?
Do I need to use a "dummy" parallel region to access static_ltree and
initialize l_desc in parallel to make sure the desired linkage occurs?
Does the static initialization of l_desc suffice to hook things up
correctly?  Is there a better or simpler way?

		Thanks in advance for any help or advice. 

		                                                clay 
		-- 
		Clay Breshears   
		Parallel Applications Engineer 
		KAI Software Labs, a division of Intel Americas, Inc.   
		phone: 217-403-4206  fax: 217-403-4399 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.openmp.org/pipermail/omp/attachments/20040113/3b804c2c/attachment.html


More information about the Omp mailing list