|
Boost Users : |
Subject: Re: [Boost-users] [Interprocess] managed_shared_memory problem in 64-bit windows (v. 1.48.0)
From: Damien (damien_at_[hidden])
Date: 2011-12-20 15:18:47
Michael,
If you're trying to spin up a copy of the MUMPS solver as a separate
process from within C++ using boost::interprocess, I've done that and it
works on every platform. Email me at this address and I'll help you out.
Damien
On 20/12/2011 1:00 PM, Michel Lestrade wrote:
> Hi,
>
> I am trying to make a shared memory block between 2 Intel Fortran
> programs and thought to use a small C/C++ lib file to accomplish this:
> Fortran can use the ISO_C_BINDING module to make its pointers point to
> C objects but not vice versa and there is a vast Fortran code base
> which we have no intention of porting.
>
> There is a native pipe mechanism but given the amount of data I will
> be exchanging, disk access is something I want to avoid. The
> application is FEM modeling and the sparse matrix can be several
> hundred MBs; as the program evolves and the matrix changes, I expect
> hundreds of GBs of data in total I/O. Seems like it would be better to
> have a shared memory region and let the OS manage things as much as
> possible.
>
> Starting small to test the idea, I am running into trouble with
> something which seems easy enough to do in the examples but which only
> seems to work in 32-bit. Here is an incomplete fragment (got stuck
> early):
>
> #include <string>
> #include <boost/interprocess/managed_shared_memory.hpp>
> using namespace boost::interprocess;
>
> struct shm_remove
> {
> shm_remove(const char *input)
> {
> name = std::string(input);
> shared_memory_object::remove(name.c_str());
> }
> ~shm_remove() {shared_memory_object::remove(name.c_str());}
> std::string name;
> } *remover;
>
> extern "C" void alloc_mumps(const int n, const int nnz, const char *name)
> {
> int size_shm = sizeof(int)*(2+2*nnz) + sizeof(double)*(nnz+2*n);
>
> remover = new shm_remove(name);
> managed_shared_memory managed_shm(create_only,name,size_shm);
>
> // Trying to do the equivalent of *i = new int
> int *i = managed_shm.construct<int>(anonymous_instance)[1](n);
> }
>
> Calling the function with n=3 and nnz=6 (a very small value compared
> to my final application) works OK when the application is compiled
> under 32-bit. Compiling under 64-bit produces an access violation
> error in win32_api.hpp:
>
> inline long interlocked_compare_exchange(long volatile *addr, long
> val1, long val2)
> { return BOOST_INTERLOCKED_COMPARE_EXCHANGE(addr, val1, val2); }
>
> values in debugger: addr=0, val1=1 val2=0.
>
> I do not know enough about Boost to know whether this is a design
> limitation, a bug or just an issue with my initial build. Just for
> reference, this is what I used:
>
> bjam --toolset=msvc-9.0 address-model=64 --build-type=complete stage
>
> Any suggestions ?
>
> Michel Lestrade
> Crosslight Software
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net