[ofa-general] Re: [PATCH][3] opensm: per mesh node information

Sasha Khapyorsky sashak at voltaire.com
Sun Nov 30 13:15:19 PST 2008


On 13:24 Sun 30 Nov     , Robert Pearson wrote:
> Hi Sasha
> 
> You wrote:
> 
> > +	if (!(node->links = calloc(num_ports, sizeof(link_t *))))
> > +		goto err;
> > +
> > +	for (i = 0; i < num_ports; i++) {
> > +		if (!(node->links[i] = calloc(1, sizeof(link_t))) ||
> > +		    !(node->links[i]->ports = calloc(num_ports,
> > sizeof(int))))
> > +			goto err;
> > +	}
> 
> Assuming that ports array is preallocated, wouldn't it be simpler to
> define link as:
> 
> typedef struct _link {
> 	int switch_id;
> 	int link_id;
> 	int num_ports;
> 	int next_port;
> 	int ports[0];
> } link_t;
> 
> , and then:
> 
> 	node->links[i] = calloc(1, sizeof(link_t *) + num_ports *
> sizeof(int))))
> 
> ?
> 
> (Similar optimizations are probably relevant in other places).
> 
> I agree they accomplish the same goal. It is a tradeoff between code that is
> a little shorter and faster and ease of understanding. I don't have strong
> feelings. (For the same reason I tend to use 'x = calloc(1, foo)' instead of
> 'x = malloc(foo); memset(x, 0, foo);' which is a very common usage pattern.)
> 
> The same applies to your later note. We can represent a two dimensional
> array as
> 
> int **array;
> 
> followed by array = calloc(1, n*sizeof(int *));
> 		array[i] = calloc(1, m*sizeof(int)); ...
> 
> and then you get to type
> 
> 		array[i][j] = xxx;
> 
> vs
> 
> int *array;
> 
> array = calloc(1, m*n*sizeof(int));
> 
> and then
> 
> array[i*m+j] = xxx;
> 
> You can't use array[i][j] here because the compiler doesn't know the size of
> the array until run time.
> 
> 
> If the code is at all complex I prefer the [][] notation because it is
> easier to read and understand. The optimizer in the compiler will take the
> pointer dereference or the multiply out of inner loops so there is not
> normally a big performance difference.
> 
> I guess that this code is complex enough that at least for now it is
> preferable to err on the side of keeping everything as straight forward as
> possible until we are sure that it is correct. Then if performance is an
> issue we can optimize it.
> 
> I am happy either way. Let me know what you want me to do.

Ok. Let's leave it for now and will look later.

Sasha



More information about the general mailing list