# Why sending data from gpu to cpu is slower than cpu to gpu?

Why sending data from gpu to cpu is slower than cpu to gpu?

I heard the relation is similar to network situation, in detail, the upload is slower than download. However, I could not understand the meaning.

In my opinion, the sending operation should be same because the two sending buses (cpu to gpu and gpu to cpu) can be made with the same performance (I mean bendwith).

• What makes you think it is necessarily slower? If you can edit your question to add that extra detail, you'll get better answers. – Dan Hulme Jan 23 '18 at 9:30

• That's not exactly accurate, though. Commands that actually send data to the API are still synchronous, e.g. you can immediately free the memory that you called glBufferData with right after calling it, since it's copied into the API then. What is possibly unsynchronized is the transfer of that data to the actual GPU memory. However, the same asynchronous transfer approaches can be applied for data download, too. It's just that in this case you usually have to wait for all previous operations to finish. – Christian Rau Jan 25 '18 at 12:52
• Yeah, but you could as well do that with glReadPixels. – Christian Rau Jan 25 '18 at 13:03
• No, glReadPixels will return immediately if you tell it to copy that data into a buffer object. Then you can do other things and then you can retrieve the data from the buffer whenever you want. – Christian Rau Jan 25 '18 at 13:16