Boost logo

Boost :

Subject: Re: [boost] Synchronization (RE: [compute] review)
From: Gruenke,Matt (mgruenke_at_[hidden])
Date: 2014-12-30 08:48:27


-----Original Message-----
From: Boost [mailto:boost-bounces_at_[hidden]] On Behalf Of Thomas M
Sent: Tuesday, December 30, 2014 7:37
To: boost_at_[hidden]
Subject: Re: [boost] Synchronization (RE: [compute] review)

> If you are going to implement such RAII guards here's a short wish-list of features / guard classes:
>
> a) make guards "transferable" across functions

I agree they should be movable, but it makes no sense for them to be copyable.

> b) a container of guards and/or a guard for a wait_list as whole

Hmmm... I can see the benefits (convenience). I'd make it a different type, though.

I assume it should hold a reference to the list? Since the guarantee is designed to block when the wait_list goes out of scope, I think it's reasonable to assume its scope is a superset of the guarantee's.

> c) a guard for a command-queue as whole
> [possibly guards for other classes as well]

Why? Convenience?

Unless you're using it as a shorthand for waiting on individual events or wait_lists, there's no need. The event_queue is internally refcounted. When the refcount goes to zero, the destructor will block on all outstanding commands.

> a) + b) because something like this is really useful:

Um... how about this:

void foo()
{
    // setup all memory objects etc.

    wait_list wl;
    wait_list::guarantee wlg(wl);

    // send data to device
    wl.insert(cq.enqueue_write_buffer_async(devmem, 0, size, host_ptr));
    wl.insert(cq.enqueue_write_buffer_async(devmem2, 0, size, host_ptr2));

    // a kernel that reads devmem and devmem2 and writes to devmem
    wl.insert(cq.enqueue_task(kern, wl)); // Note: wl is copied by enqueue funcs

    // copy result back to host
    wl.insert(cq.enqueue_read_buffer_async(devmem, 0, size, host_ptr, wl));

    // wl.wait() would only be necessary if you wanted to access the results, here.

    // Enqueue an independent set of operations with another wait_list
    wait_list wl_b;
    wait_list::guarantee wlg_b(wl);

    // send data to device
    wl_b.insert(cq.enqueue_write_buffer_async(devmem_b, 0, size_b, host_ptr_b));

    // ...
}

> With c) I have something like this in mind:

What about this?

{
    command_queue cq(cntx, dev);
    command_queue::guarantee cqg(cq);
    cq.enqueue_write_buffer_async(devmem, 0, size, host_ptr)
    transform(..., cq); // implicitly async cq.enqueue_read_buffer_async(...);

    // here automatic synchronization occurs
}

It does presume that command_queues are local and tied to related batches of computations. Those assumptions won't always hold.

Matt

________________________________

This e-mail contains privileged and confidential information intended for the use of the addressees named above. If you are not the intended recipient of this e-mail, you are hereby notified that you must not disseminate, copy or take any action in respect of any information contained in it. If you have received this e-mail in error, please notify the sender immediately by e-mail and immediately destroy this e-mail and its attachments.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk