mem: support for gpu-style RMWs in ruby
Review Request #3205 - Created Nov. 12, 2015 and submitted
| Information | |
|---|---|
| Tony Gutierrez | |
| gem5 | |
| default | |
| Reviewers | |
| Default | |
Changeset 11280:f5e328bd5233 --------------------------- mem: support for gpu-style RMWs in ruby This patch adds support for GPU-style read-modify-write (RMW) operations in ruby. Such atomic operations are traditionally executed at the memory controller (instead of through an L1 cache using cache-line locking). Currently, this patch works by propogating operation functors through the memory system.
-
src/base/types.hh (Diff revision 1) -
Joel's comment from 3185:
I'm a little confused about the need for this. Is it not possible to just set a function pointer in Requests? Why do we need to dynamically instantiate and delete a wrapper class for the function pointer in each atomic Request?
-
src/mem/protocol/RubySlicc_Exports.sm (Diff revision 1) -
Joel's comment from 3185:
Why have separate GPU atomic types? I don't see where there are used in other patches.
-
src/mem/request.hh (Diff revision 1) -
Joel's comment from 3185:
This flag doesn't appear to be used anywhere...
Description: |
|
|||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 2 (+94 -11) |
Description: |
|
|||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 3 (+90 -11) |
Any more comments on this? We're planning on shipping in by the end of the week.
This is a major change to the memory system, and I find the description rather misleading. It would be good to get some more examples, and make sure that this works as a general solution for "in-memory-system operations". What are the assumptions? Cache line sized only? What is the relation between packets and these requests?
Also, is there a specific reason why you have opted for the crazily generic functor, as opposed to hard-coding the supported functions?
I'd like to also understand how this relates to something like ARM v8.1 far atomics (and answers to the questions above would help tremendously with that).
-
src/mem/request.hh (Diff revision 3) -
Why? That seems very odd
-
src/base/types.hh (Diff revision 3) -
Needs comments
-
src/mem/abstract_mem.cc (Diff revision 3) -
This does not match what you mention in your comment. I thought this would be a special SwapReq (and as such always fit in a cacheline)?
-
src/mem/protocol/RubySlicc_Exports.sm (Diff revision 3) -
Seems to disagree with the one above
-
src/mem/request.hh (Diff revision 3) -
How does this interact with SWAP?
-
src/mem/request.hh (Diff revision 3) -
More elaborate comments please
-
src/mem/request.hh (Diff revision 3) -
We really need to use delegating constructors for these kinds of things. This is just silly :-)
-
src/mem/request.hh (Diff revision 3) -
const
-
src/mem/request.hh (Diff revision 3) -
stick to nullptr
-
src/mem/request.hh (Diff revision 3) -
const
Description: |
|
|||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 4 (+149 -39) |
Description: |
|
|||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Diff: |
Revision 5 (+149 -39) |
I still find that the design needs a far better explanation, and at least one simple example. I would suggest implementing the SwapReq as an atomic op (as I guess it is our only example). Also, surely we need to impose restrictions on the granularity? If we use SwapReq as an example then things would be much more clear.
I am also not sure about Joel's comments having been addressed.
I'm okay with this patch as-is. Thanks for cleaning it up!
