Andrew Somorjai, le Tue 20 Nov 2012 01:39:47 +0100, a écrit :
> "CreateThread() and WaitForMultipleObjects() are not in hwloc since they have 
> nothing to do with topologies."
> 
> I thought hwloc was also for threading?

It can bind your threads, yes, but the way to create the thread is
yours, it can be CreateThread, or OpenMP, etc...

> "DWORD_PTR m_id = 0;
> DWORD_PTR m_mask = 1 << i;
> 
> m_threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadMain, 
> (LPVOID)i, NULL, &m_id);
> SetThreadAffinityMask(m_threads[i], m_mask);
> 
> This will likely be something such as:
> 
> hwloc_bitmap_t bitmap = hwloc_bitmap_alloc();
> hwloc_bitmap_set_only(bitmap, i);
> hwloc_set_thread_cpubind(topology, m_threads[i], bitmap, 0);
> hwloc_bitmap_free(bitmap);"
> 
> How would I pass a function like threadMain in the above CreateThread 
> function into the thread itself. Someone told me to use this library for this 
> purpose so I wasn't sure what it was made for. 

You should indeed use hwloc to replace the SetThreadAffinityMask, but
keep your CreateThread.

> How would I create an array m_threads and pass it
> into hwloc_set_thread_cpubind. I would still need this part then correct?
> 
> m_threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadMain, 
> (LPVOID)i, NULL, &m_id); 

Yes, something like:

m_threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadMain, 
(LPVOID)i, NULL, &m_id);

hwloc_bitmap_t bitmap = hwloc_bitmap_alloc();
hwloc_bitmap_set_only(bitmap, i);
hwloc_set_thread_cpubind(topology, m_threads[i], bitmap, 0);
hwloc_bitmap_free(bitmap);"

> I would like to be independent of windows.h   by the way, not using windows 
> api calls is the motivation for all of this.

Ah, then you may want to also use the pthread-win32 package, which is
meant to replace CreateThread, and use pthread_getw32threadhandle_np in
the windows case to convert from pthread-win32's pthread_t into a HANDLE
for hwloc.

Samuel

Reply via email to