I have checked API of hwloc_topology_insert_misc_object_by_parent and there is no support for color:
hwloc_obj_t hwloc_topology_insert_misc_object_by_cpuset (hwloc_topology_t
topology, hwloc_const_cpuset_t cpuset, const char *name)
Add a MISC object to the topology.
hwloc_obj_t hwloc_topology_insert_misc_object_by_parent (hwloc_topology_t
topology, hwloc_obj_t parent, const char *name)
Add a MISC object as a leaf of the topology.
Nevertheless I gave it a try but i cannot get it running. Original code
(using cpuset) was
hwloc_bitmap_zero(cpuset);
hwloc_bitmap_set(cpuset, d->lines[j]->cpu[i]);
snprintf(data, 128, "%d: %d", i, d->lines[j]->cpu[0]);
hwloc_topology_insert_misc_object_by_cpuset(topology, cpuset, data);
I have now changed it to
hwloc_obj[0] = hwloc_get_first_largest_obj_inside_cpuset(topology, cpuset);
hwloc_obj[1] = hwloc_obj[0]->parent;
and tried both
hwloc_topology_insert_misc_object_by_parent (topology, hwloc_obj[0], data);
hwloc_topology_insert_misc_object_by_parent (topology, hwloc_obj[1], data);
but lstopo will core dump with the XML file
$lstopo --input /tmp/a.xml
lstopo: topology.c:1128: add_default_object_sets: Assertion `obj->cpuset'
failed.
Aborted (core dumped)
I have attached
- source code
- input file data
- out /tmp/a.xml
Commands to reproduce the problem;
gcc -Wall -Wextra -o parse parse.c -lhwloc
./parse data
lstopo --input /tmp/a.xml
Any idea what's wrong?
Thanks
Jirka
On Fri, Jun 21, 2013 at 2:20 PM, Samuel Thibault
<[email protected]>wrote:
> Jiri Hladky, le Thu 20 Jun 2013 22:08:03 +0200, a écrit :
> > lstopo has obviously some logic how to sort the data inserted
> > by hwloc_topology_insert_misc_object_by_cpuset. Could be data displayed
> in the
> > same order as inserted?
>
> hwloc_topology_insert_misc_object_by_parent probably does that, you just
> need to replace the cpuset with an hwloc object.
>
> Samuel
> _______________________________________________
> hwloc-devel mailing list
> [email protected]
> http://www.open-mpi.org/mailman/listinfo.cgi/hwloc-devel
>
/* vim: set expandtab cindent fdm=marker ts=2 sw=2: */
/*
gcc -Wall -Wextra -o parse parse.c -lhwloc
See also
hwloc-calc -p --hierarchical socket.core.PU pu:3
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <hwloc.h>
FILE *util_Fopen (const char *path, const char *mode) {
FILE *f;
errno = 0;
f = fopen (path, mode);
if (f == NULL) {
fprintf (stdout, "\nOpening of %s failed: %s\n\n",
path, strerror (errno));
exit (EXIT_FAILURE);
return NULL; /* to eliminate a warning from the compiler */
} else
return f;
}
int util_Fclose (FILE * f)
{
int s;
if (f == NULL)
return 0;
errno = 0;
s = fclose (f);
if (s != 0)
fprintf (stdout, "\nClosing of file failed: %s\n\n", strerror (errno));
return s;
}
int util_GetLine (FILE *infile, char *Line, char c) {
size_t j;
while (NULL != fgets (Line, 1024, infile)) { /* Not EOF and no error */
/* Find first non-white character in Line */
j = strspn (Line, " \t\r\f\v");
/* Discard blank lines and lines whose first non-white character is c */
if (Line[j] == '\n' || Line[j] == c)
continue;
else {
char *p;
/* If the character c appears, delete the rest of the line*/
if ((p = strchr (Line, c)))
*p = '\0';
else {
/* Remove the \n char at the end of line */
j = strlen (Line);
if (Line[j - 1] == '\n')
Line[j - 1] = '\0';
}
return 0;
}
}
util_Fclose (infile);
return -1;
/* util_Error ("GetLine: an error has occurred on reading"); */
}
/************************************************************************/
void *util_Malloc (size_t size) {
void *p;
errno = 0;
p = malloc (size);
if (p == NULL) {
fprintf (stdout, "\nmalloc failed: %s\n\n", strerror (errno));
exit (EXIT_FAILURE);
return NULL; /* to eliminate a warning from the compiler */
} else
return p;
}
void *util_Calloc (size_t count, size_t esize) {
void *p;
errno = 0;/* vim: set expandtab cindent fdm=marker ts=2 sw=2: */
p = calloc (count, esize);
if (p == NULL) {
fprintf (stdout, "\ncalloc failed: %s\n\n", strerror (errno));
exit (EXIT_FAILURE);
return NULL; /* to eliminate a warning from the compiler */
} else
return p;
}
void *util_Realloc (void *ptr, size_t size) {
void *p;
errno = 0;
p = realloc (ptr, size);
if ((p == NULL) && (size != 0)) {
fprintf (stdout, "\nrealloc failed: %s\n\n", strerror (errno));
exit (EXIT_FAILURE);
return ptr; /* to eliminate a warning from the compiler */
} else
return p;
}
void *util_Free (void *p) {
if (p == NULL)
return NULL;
free (p);
return NULL;
}
typedef struct {
unsigned int *cpu;
size_t used;
size_t size;
} Line_t;
Line_t* initLine(size_t initialSize) {
Line_t* l;
l = (Line_t*) util_Malloc(sizeof(Line_t));
l->cpu = (unsigned int *)util_Malloc(initialSize * sizeof(unsigned int));
l->used = 0;
l->size = initialSize;
return l;
}
Line_t* copyLine(Line_t* d) {
Line_t* l;
l = (Line_t*) util_Malloc(sizeof(Line_t));
l->cpu = (unsigned int *)util_Malloc(d->size * sizeof(unsigned int));
memcpy(l->cpu, d->cpu, d->used * sizeof(unsigned int));
l->used = d->used;
l->size = d->size;
return l;
}
void insertElement(Line_t *l, unsigned int element) {
if (l->used == l->size) {
l->size *= 2;
l->cpu = (unsigned int *)util_Realloc(l->cpu, l->size * sizeof(unsigned int));
}
l->cpu[l->used++] = element;
}
void clearLine(Line_t *l) {
l->used = 0;
}
void freeLine(Line_t *l) {
util_Free(l->cpu);
l->cpu = NULL;
l->used = l->size = 0;
util_Free(l);
}
void printLine(Line_t *l) {
unsigned int i;
for(i=0; i < l->used; ++i) {
printf("%d ", l->cpu[i]);
}
printf("\n");
}
typedef struct {
Line_t** lines ;
size_t used;
size_t size;
} Data_t;
Data_t* initData(size_t initialSize) {
Data_t* d;
d = (Data_t*) util_Malloc(sizeof(Data_t));
d->lines = (Line_t**)util_Malloc(initialSize * sizeof(Line_t*));
d->used = 0;
d->size = initialSize;
return d;
}
void insertLine(Data_t *d, Line_t* element) {
if (d->used == d->size) {
d->size *= 2;
d->lines = (Line_t**)util_Realloc(d->lines, d->size * sizeof(Line_t*));
}
d->lines[d->used] = copyLine (element);
d->used++;
}
void util_FreeData(Data_t *d) {
unsigned int i;
for (i=0; i<d->used; ++i) {
freeLine (d->lines[i]);
}
util_Free(d->lines);
d->lines = NULL;
d->used = d->size = 0;
util_Free(d);
}
void printData(Data_t *d) {
unsigned int i;
for (i=0; i<d->used; ++i) {
printLine (d->lines[i]);
}
}
int main(int argc, char **argv) {
hwloc_topology_t topology;
hwloc_bitmap_t cpuset;
FILE* in = util_Fopen(argv[1], "r");
char * line = NULL;
size_t len = 0;
ssize_t read, pos;
char c = '#';
char *p;
Data_t* d;
Line_t* l;
long int n;
l = initLine(64);
d = initData(16);
while ((read = getline(&line, &len, in)) != -1) {
/* Find first non-white character in Line */
pos = strspn (line, " \t\r\f\v");
/* Discard blank lines and lines whose first non-white character is c */
if (line[pos] == '\n' || line[pos] == c)
continue;
else {
/* If the character c appears, delete the rest of the line*/
if ((p = strchr (line, c)))
*p = '\0';
else {
/* Remove the \n char at the end of line */
pos = strlen (line);
if (line[pos - 1] == '\n')
line[pos - 1] = '\0';
}
//Split line into the records
p = strtok (line," ");
while (p != NULL) {
n = strtol(p, NULL, 10);
insertElement(l,n);
p = strtok (NULL, " ");
}
insertLine(d,l);
clearLine(l);
}
}
if (line)
free(line);
printData(d);
/* Allocate and initialize topology object. */
hwloc_topology_init(&topology);
/* ... Optionally, put detection configuration here to ignore
some objects types, define a synthetic topology, etc....
The default is to detect all the objects of the machine that
the caller is allowed to access. See Configure Topology
Detection. */
/* Perform the topology detection. */
hwloc_topology_load(topology);
cpuset = hwloc_bitmap_alloc();
unsigned int i, j, max_columns;
max_columns = 0;
char data[128];
for (i=0; i<d->used; ++i) {
if( d->lines[i]->used > max_columns) max_columns = d->lines[i]->used;
}
for (i = 1; i < max_columns; ++i ) {
for (j=0; j<d->used; ++j) {
if ( d->lines[j]->used >= i ) {
hwloc_bitmap_zero(cpuset);
hwloc_bitmap_set(cpuset, d->lines[j]->cpu[i]);
snprintf(data, 128, "%d: %d", i, d->lines[j]->cpu[0]);
printf("%s\n", data);
hwloc_obj_t hwloc_obj[2];
hwloc_obj[0] = hwloc_get_first_largest_obj_inside_cpuset(topology, cpuset);
hwloc_obj[1] = hwloc_obj[0]->parent;
if ( hwloc_obj == NULL ) printf("ERROR");
char string[200];
hwloc_obj_type_snprintf(string, sizeof(string), hwloc_obj[1], 0);
printf("%s\n", string);
hwloc_obj_attr_snprintf(string, sizeof(string), hwloc_obj[1], ": ", 0);
printf("%s\n", string);
hwloc_obj_snprintf (string, sizeof(string), topology, hwloc_obj[1], NULL, 1);
printf("%s\n", string);
printf("OS index: %u\n", hwloc_obj[1]->os_index);
hwloc_topology_insert_misc_object_by_parent (topology, hwloc_obj[1], data);
//hwloc_topology_insert_misc_object_by_cpuset(topology, cpuset, data);
}
}
}
hwloc_topology_export_xml(topology,"/tmp/a.xml");
return(EXIT_SUCCESS);
}
data
Description: Binary data
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topology SYSTEM "hwloc.dtd">
<topology>
<object type="Machine" os_index="0" cpuset="0x0000000f" complete_cpuset="0x0000000f" online_cpuset="0x0000000f" allowed_cpuset="0x0000000f" local_memory="16537890816">
<page_type size="4096" count="4037571"/>
<page_type size="2097152" count="0"/>
<info name="DMIProductName" value="2429BP3"/>
<info name="DMIProductVersion" value="ThinkPad T530"/>
<info name="DMIBoardVendor" value="LENOVO"/>
<info name="DMIBoardName" value="2429BP3"/>
<info name="DMIBoardVersion" value="Not Available"/>
<info name="DMIBoardAssetTag" value="Not Available"/>
<info name="DMIChassisVendor" value="LENOVO"/>
<info name="DMIChassisType" value="10"/>
<info name="DMIChassisVersion" value="Not Available"/>
<info name="DMIChassisAssetTag" value="RH0004408"/>
<info name="DMIBIOSVendor" value="LENOVO"/>
<info name="DMIBIOSVersion" value="G4ET37WW (1.12 )"/>
<info name="DMIBIOSDate" value="05/29/2012"/>
<info name="DMISysVendor" value="LENOVO"/>
<info name="Backend" value="Linux"/>
<info name="LinuxCgroup" value="/"/>
<info name="OSName" value="Linux"/>
<info name="OSRelease" value="3.9.5-201.fc18.x86_64"/>
<info name="OSVersion" value="#1 SMP Tue Jun 11 19:40:51 UTC 2013"/>
<info name="HostName" value="localhost.localdomain"/>
<info name="Architecture" value="x86_64"/>
<object type="Socket" os_index="0" cpuset="0x0000000f" complete_cpuset="0x0000000f" online_cpuset="0x0000000f" allowed_cpuset="0x0000000f">
<info name="CPUModel" value="Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz"/>
<info name="CPUType" value="x86_64"/>
<object type="Cache" cpuset="0x0000000f" complete_cpuset="0x0000000f" online_cpuset="0x0000000f" allowed_cpuset="0x0000000f" cache_size="4194304" depth="3" cache_linesize="64" cache_associativity="16">
<object type="Cache" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" cache_size="262144" depth="2" cache_linesize="64" cache_associativity="8">
<object type="Cache" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" cache_size="32768" depth="1" cache_linesize="64" cache_associativity="8">
<object type="Core" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003">
<object type="PU" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001"/>
<object type="PU" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002"/>
<object type="Misc" name="1: 245"/>
<object type="Misc" name="1: 246"/>
<object type="Misc" name="2: 245"/>
<object type="Misc" name="2: 246"/>
<object type="Misc" name="3: 245"/>
<object type="Misc" name="3: 246"/>
<object type="Misc" name="4: 245"/>
<object type="Misc" name="4: 246"/>
<object type="Misc" name="5: 245"/>
<object type="Misc" name="5: 246"/>
<object type="Misc" name="6: 245"/>
<object type="Misc" name="7: 245"/>
<object type="Misc" name="9: 245"/>
<object type="Misc" name="9: 246"/>
<object type="Misc" name="10: 245"/>
<object type="Misc" name="10: 246"/>
</object>
</object>
</object>
<object type="Cache" cpuset="0x0000000c" complete_cpuset="0x0000000c" online_cpuset="0x0000000c" allowed_cpuset="0x0000000c" cache_size="262144" depth="2" cache_linesize="64" cache_associativity="8">
<object type="Cache" cpuset="0x0000000c" complete_cpuset="0x0000000c" online_cpuset="0x0000000c" allowed_cpuset="0x0000000c" cache_size="32768" depth="1" cache_linesize="64" cache_associativity="8">
<object type="Core" os_index="1" cpuset="0x0000000c" complete_cpuset="0x0000000c" online_cpuset="0x0000000c" allowed_cpuset="0x0000000c">
<object type="PU" os_index="2" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004"/>
<object type="PU" os_index="3" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008"/>
<object type="Misc" name="6: 246"/>
<object type="Misc" name="7: 246"/>
<object type="Misc" name="8: 245"/>
<object type="Misc" name="8: 246"/>
</object>
</object>
</object>
</object>
</object>
</object>
</topology>
