[RFC] Mechanism for high priority scheduling in amdgpu
Christian König
christian.koenig at amd.com
Mon Jan 2 15:43:40 UTC 2017
Indeed a couple of nice numbers.
> but everything already commited
> to the HW queue is executed in strict FIFO order.
Well actually if we get a high priority submission we could
preempt/abort everything on the ring buffer before it in theory.
Probably not as fine granularity as the hardware scheduler, but might be
easier to get working.
Regards,
Christian.
Am 26.12.2016 um 03:26 schrieb zhoucm1:
> Nice experiment, which is exactly SW scheduler can provide.
> And as you said "I.e. your context can be scheduled into the
> HW queue ahead of any other context, but everything already commited
> to the HW queue is executed in strict FIFO order."
>
> If you want to keep consistent latency, which will need to enable hw
> priority queue feature.
>
> Regards,
> David Zhou
>
> On 2016年12月24日 06:20, Andres Rodriguez wrote:
>> Hey John,
>>
>> I've collected bit of data using high priority SW scheduler queues,
>> thought you might be interested.
>>
>> Implementation as per the patch above.
>>
>> Control test 1
>> ==============
>>
>> Sascha Willems mesh sample running on its own at regular priority
>>
>> Results
>> -------
>>
>> Mesh: ~0.14ms per-frame latency
>>
>> Control test 2
>> ==============
>>
>> Two Sascha Willems mesh sample running on its own at regular priority
>>
>> Results
>> -------
>>
>> Mesh 1: ~0.26ms per-frame latency
>> Mesh 2: ~0.26ms per-frame latency
>>
>> Test 1
>> ======
>>
>> Two Sascha Willems mesh samples running simultaneously. One at high
>> priority and the other running in a regular priority graphics context.
>>
>> Results
>> -------
>>
>> Mesh High: 0.14 - 0.24ms per-frame latency
>> Mesh Regular: 0.24 - 0.40ms per-frame latency
>>
>> Test 2
>> ======
>>
>> Ten Sascha Willems mesh samples running simultaneously. One at high
>> priority and the others running in a regular priority graphics context.
>>
>> Results
>> -------
>>
>> Mesh High: 0.14 - 0.8ms per-frame latency
>> Mesh Regular: 1.10 - 2.05ms per-frame latency
>>
>> Test 3
>> ======
>>
>> Two Sascha Willems mesh samples running simultaneously. One at high
>> priority and the other running in a regular priority graphics context.
>>
>> Also running Unigine Heaven at Exteme preset @ 2560x1600
>>
>> Results
>> -------
>>
>> Mesh High: 7 - 100ms per-frame latency (Lots of fluctuation)
>> Mesh Regular: 40 - 130ms per-frame latency(Lots of fluctuation)
>> Unigine Heaven: 20-40 fps
>>
>>
>> Test 4
>> ======
>>
>> Two Sascha Willems mesh samples running simultaneously. One at high
>> priority and the other running in a regular priority graphics context.
>>
>> Also running Talos Principle @ 4K
>>
>> Results
>> -------
>>
>> Mesh High: 0.14 - 3.97ms per-frame latency (Mostly floats ~0.4ms)
>> Mesh Regular: 0.43 - 8.11ms per-frame latency (Lots of fluctuation)
>> Talos: 24.8 fps AVG
>>
>> Observations
>> ============
>>
>> The high priority queue based on the SW scheduler provides significant
>> gains when paired with tasks that submit short duration commands into
>> the queue. This can be observed in tests 1 and 2.
>>
>> When the pipe is full of long running commands, the effects are dampened.
>> As observed in test 3, the per-frame latency suffers very large spikes,
>> and the latencies are very inconsistent.
>>
>> Talos seems to be a better behaved game. It may be submitting shorter
>> draw commands and the SW scheduler is able to interleave the rest of
>> the work.
>>
>> The results seem consistent with the hypothetical advantages the SW
>> scheduler should provide. I.e. your context can be scheduled into the
>> HW queue ahead of any other context, but everything already commited
>> to the HW queue is executed in strict FIFO order.
>>
>> In order to deal with cases similar to Test 3, we will need to take
>> advantage of further features.
>>
>> Notes
>> =====
>>
>> - Tests were run multiple times, and reboots were performed during tests.
>> - The mesh sample isn't really designed for benchmarking, but it should
>> be decent for ballpark figures
>> - The high priority mesh app was run with default niceness and also
>> niceness
>> at -20. This had no effect on the results, so it was not added above.
>> - CPU usage was not saturated while running the tests
>>
>> Regards,
>> Andres
>>
>>
>> On Fri, Dec 23, 2016 at 1:18 PM, Pierre-Loup A. Griffais
>> <pgriffais at valvesoftware.com <mailto:pgriffais at valvesoftware.com>> wrote:
>>
>> I hate to keep bringing up display topics in an unrelated
>> conversation, but I'm not sure where you got "Application -> X
>> server -> compositor -> X server" from. As I was saying before,
>> we need to be presenting directly to the HMD display as no
>> display server can be in the way, both for latency but also
>> quality of service reasons (a buggy application cannot be allowed
>> to accidentally display undistorted rendering into the HMD); we
>> intend to do the necessary work for this, and the extent of X's
>> (or a Wayland implementation, or any other display server)
>> involvment will be to participate enough to know that the HMD
>> display is off-limits. If you have more questions on the display
>> aspect, or VR rendering in general, I'm happy to try to address
>> them out-of-band from this conversation.
>>
>>
>> On 12/23/2016 02:54 AM, Christian König wrote:
>>
>> But yes, in general you don't want another compositor in
>> the way, so
>> we'll be acquiring the HMD display directly, separate
>> from any desktop
>> or display server.
>>
>> Assuming that the the HMD is attached to the rendering device
>> in some
>> way you have the X server and the Compositor which both try
>> to be DRM
>> master at the same time.
>>
>> Please correct me if that was fixed in the meantime, but that
>> sounds
>> like it will simply not work. Or is this what Andres mention
>> below Dave
>> is working on ?.
>>
>> Additional to that a compositor in combination with X is a
>> bit counter
>> productive when you want to keep the latency low.
>>
>> E.g. the "normal" flow of a GL or Vulkan surface filled with
>> rendered
>> data to be displayed is from the Application -> X server ->
>> compositor
>> -> X server.
>>
>> The extra step between X server and compositor just means
>> extra latency
>> and for this use case you probably don't want that.
>>
>> Targeting something like Wayland and when you need X
>> compatibility
>> XWayland sounds like the much better idea.
>>
>> Regards,
>> Christian.
>>
>> Am 22.12.2016 um 20:54 schrieb Pierre-Loup A. Griffais:
>>
>> Display concerns are a separate issue, and as Andres said
>> we have
>> other plans to address. But yes, in general you don't
>> want another
>> compositor in the way, so we'll be acquiring the HMD
>> display directly,
>> separate from any desktop or display server. Same with
>> security, we
>> can have a separate conversation about that when the time
>> comes.
>>
>> On 12/22/2016 08:41 AM, Serguei Sagalovitch wrote:
>>
>> Andres,
>>
>> Did you measure latency, etc. impact of __any__
>> compositor?
>>
>> My understanding is that VR has pretty strict
>> requirements related to
>> QoS.
>>
>> Sincerely yours,
>> Serguei Sagalovitch
>>
>>
>> On 2016-12-22 11:35 AM, Andres Rodriguez wrote:
>>
>> Hey Christian,
>>
>> We are currently interested in X, but with some
>> distros switching to
>> other compositors by default, we also need to
>> consider those.
>>
>> We agree, running the full vrcompositor in root
>> isn't something that
>> we want to do. Too many security concerns. Having
>> a small root helper
>> that does the privilege escalation for us is the
>> initial idea.
>>
>> For a long term approach, Pierre-Loup and Dave
>> are working on dealing
>> with the "two compositors" scenario a little
>> better in DRM+X.
>> Fullscreen isn't really a sufficient approach,
>> since we don't want the
>> HMD to be used as part of the Desktop environment
>> when a VR app is not
>> in use (this is extremely annoying).
>>
>> When the above is settled, we should have an auth
>> mechanism besides
>> DRM_MASTER or DRM_AUTH that allows the
>> vrcompositor to take over the
>> HMD permanently away from X. Re-using that auth
>> method to gate this
>> IOCTL is probably going to be the final solution.
>>
>> I propose to start with ROOT_ONLY since it should
>> allow us to respect
>> kernel IOCTL compatibility guidelines with the
>> most flexibility. Going
>> from a restrictive to a more flexible permission
>> model would be
>> inclusive, but going from a general to a
>> restrictive model may exclude
>> some apps that used to work.
>>
>> Regards,
>> Andres
>>
>> On 12/22/2016 6:42 AM, Christian König wrote:
>>
>> Hi Andres,
>>
>> well using root might cause stability and
>> security problems as well.
>> We worked quite hard to avoid exactly this for X.
>>
>> We could make this feature depend on the
>> compositor being DRM master,
>> but for example with X the X server is master
>> (and e.g. can change
>> resolutions etc..) and not the compositor.
>>
>> So another question is also what windowing
>> system (if any) are you
>> planning to use? X, Wayland, Flinger or
>> something completely
>> different ?
>>
>> Regards,
>> Christian.
>>
>> Am 20.12.2016 um 16:51 schrieb Andres Rodriguez:
>>
>> Hi Christian,
>>
>> That is definitely a concern. What we are
>> currently thinking is to
>> make the high priority queues accessible
>> to root only.
>>
>> Therefore is a non-root user attempts to
>> set the high priority flag
>> on context allocation, we would fail the
>> call and return ENOPERM.
>>
>> Regards,
>> Andres
>>
>>
>> On 12/20/2016 7:56 AM, Christian König wrote:
>>
>> BTW: If there is non-VR
>> application which will use
>> high-priority
>> h/w queue then VR application
>> will suffer. Any ideas how
>> to solve it?
>>
>> Yeah, that problem came to my mind as
>> well.
>>
>> Basically we need to restrict those
>> high priority submissions to
>> the VR compositor or otherwise any
>> malfunctioning application could
>> use it.
>>
>> Just think about some WebGL suddenly
>> taking all our rendering away
>> and we won't get anything drawn any more.
>>
>> Alex or Michel any ideas on that?
>>
>> Regards,
>> Christian.
>>
>> Am 19.12.2016 um 15:48 schrieb
>> Serguei Sagalovitch:
>>
>> > If compute queue is occupied
>> only by you, the efficiency
>> > is equal with setting job queue
>> to high priority I think.
>> The only risk is the situation
>> when graphics will take all
>> needed CUs. But in any case it
>> should be very good test.
>>
>> Andres/Pierre-Loup,
>>
>> Did you try to do it or it is a
>> lot of work for you?
>>
>>
>> BTW: If there is non-VR
>> application which will use
>> high-priority
>> h/w queue then VR application
>> will suffer. Any ideas how
>> to solve it?
>>
>> Sincerely yours,
>> Serguei Sagalovitch
>>
>> On 2016-12-19 12:50 AM, zhoucm1
>> wrote:
>>
>> Do you encounter the priority
>> issue for compute queue with
>> current driver?
>>
>> If compute queue is occupied
>> only by you, the efficiency
>> is equal
>> with setting job queue to
>> high priority I think.
>>
>> Regards,
>> David Zhou
>>
>> On 2016年12月19日 13:29, Andres
>> Rodriguez wrote:
>>
>> Yes, vulkan is available
>> on all-open through the
>> mesa radv UMD.
>>
>> I'm not sure if I'm
>> asking for too much, but
>> if we can
>> coordinate a similar
>> interface in radv and
>> amdgpu-pro at the
>> vulkan level that would
>> be great.
>>
>> I'm not sure what that's
>> going to be yet.
>>
>> - Andres
>>
>> On 12/19/2016 12:11 AM,
>> zhoucm1 wrote:
>>
>>
>>
>> On 2016年12月19日 11:33,
>> Pierre-Loup A.
>> Griffais wrote:
>>
>> We're currently
>> working with the
>> open stack; I
>> assume that a
>> mechanism could
>> be exposed by
>> both open and Pro
>> Vulkan
>> userspace drivers
>> and that the
>> amdgpu kernel
>> interface
>> improvements we
>> would pursue
>> following this
>> discussion would
>> let both drivers
>> take advantage of
>> the feature, correct?
>>
>> Of course.
>> Does open stack have
>> Vulkan support?
>>
>> Regards,
>> David Zhou
>>
>>
>> On 12/18/2016
>> 07:26 PM, zhoucm1
>> wrote:
>>
>> By the way,
>> are you using
>> all-open
>> driver or
>> amdgpu-pro
>> driver?
>>
>> +David Mao,
>> who is
>> working on
>> our Vulkan
>> driver.
>>
>> Regards,
>> David Zhou
>>
>> On
>> 2016年12月18日
>> 06:05,
>> Pierre-Loup
>> A. Griffais
>> wrote:
>>
>> Hi Serguei,
>>
>> I'm also
>> working
>> on the
>> bringing
>> up our VR
>> runtime
>> on top of
>> amgpu;
>> see
>> replies
>> inline.
>>
>> On
>> 12/16/2016
>> 09:05 PM,
>> Sagalovitch,
>> Serguei
>> wrote:
>>
>> Andres,
>>
>> For
>> current
>> VR
>> workloads
>> we
>> have
>> 3
>> separate
>> processes
>> running
>> actually:
>>
>> So we
>> could
>> have
>> potential
>> memory
>> overcommit
>> case
>> or do
>> you do
>> partitioning
>> on
>> your
>> own?
>> I
>> would
>> think
>> that
>> there
>> is
>> need
>> to avoid
>> overcomit
>> in
>> VR
>> case to
>> prevent
>> any
>> BO
>> migration.
>>
>>
>> You're
>> entirely
>> correct;
>> currently
>> the VR
>> runtime is
>> setting up
>> prioritized
>> CPU
>> scheduling
>> for its
>> VR
>> compositor,
>> we're
>> working on
>> prioritized
>> GPU
>> scheduling
>> and
>> pre-emption
>> (eg. this
>> thread),
>> and in
>> the
>> future it
>> will make
>> sense to
>> do work
>> in order
>> to make
>> sure that
>> its
>> memory
>> allocations
>> do not
>> get
>> evicted,
>> to
>> prevent any
>> unwelcome
>> additional
>> latency
>> in the
>> event of
>> needing
>> to perform
>> just-in-time
>> reprojection.
>>
>> BTW:
>> Do
>> you
>> mean
>> __real__
>> processes
>> or
>> threads?
>> Based
>> on my
>> understanding
>> sharing
>> BOs
>> between
>> different
>> processes
>> could
>> introduce
>> additional
>> synchronization
>> constrains.
>> btw:
>> I am not
>> sure
>> if we
>> are
>> able
>> to
>> share
>> Vulkan
>> sync.
>> object
>> cross-process
>> boundary.
>>
>>
>> They are
>> different
>> processes;
>> it is
>> important
>> for the
>> compositor
>> that
>> is
>> responsible
>> for
>> quality-of-service
>> features
>> such as
>> consistently
>> presenting
>> distorted
>> frames
>> with the
>> right
>> latency,
>> reprojection,
>> etc,
>> to be
>> separate
>> from the
>> main
>> application.
>>
>> Currently
>> we are
>> using
>> unreleased
>> cross-process
>> memory and
>> semaphore
>> extensions
>> to fetch
>> updated
>> eye
>> images
>> from the
>> client
>> application,
>> but the
>> just-in-time
>> reprojection
>> discussed
>> here does not
>> actually
>> have any
>> direct
>> interactions
>> with
>> cross-process
>> resource
>> sharing,
>> since
>> it's
>> achieved
>> by using
>> whatever
>> is the
>> latest, most
>> up-to-date
>> eye
>> images
>> that have
>> already
>> been sent
>> by the client
>> application,
>> which are
>> already
>> available
>> to use
>> without
>> additional
>> synchronization.
>>
>>
>>
>> 3)
>> System
>> compositor
>> (we
>> are
>> looking
>> at
>> approaches
>> to
>> remove
>> this
>> overhead)
>>
>> Yes,
>> IMHO
>> the
>> best
>> is to
>> run
>> in
>> "full
>> screen
>> mode".
>>
>>
>> Yes, we
>> are
>> working
>> on
>> mechanisms
>> to
>> present
>> directly
>> to the
>> headset
>> display
>> without
>> any
>> intermediaries
>> as a
>> separate
>> effort.
>>
>>
>> The
>> latency
>> is
>> our
>> main
>> concern,
>>
>> I
>> would
>> assume
>> that
>> this
>> is
>> the
>> known
>> problem
>> (at
>> least for
>> compute
>> usage).
>> It
>> looks
>> like
>> that
>> amdgpu
>> /
>> kernel
>> submission
>> is
>> rather
>> CPU
>> intensive
>> (at least
>> in
>> the
>> default
>> configuration).
>>
>>
>> As long
>> as it's a
>> consistent
>> cost, it
>> shouldn't
>> an issue.
>> However, if
>> there's
>> high
>> degrees
>> of
>> variance
>> then that
>> would be
>> troublesome
>> and we
>> would
>> need to
>> account
>> for the
>> worst case.
>>
>> Hopefully
>> the
>> requirements
>> and
>> approach
>> we
>> described
>> make
>> sense, we're
>> looking
>> forward
>> to your
>> feedback
>> and
>> suggestions.
>>
>> Thanks!
>> -
>> Pierre-Loup
>>
>>
>> Sincerely
>> yours,
>> Serguei
>> Sagalovitch
>>
>>
>> From:
>> Andres
>> Rodriguez
>> <andresr at valvesoftware.com
>> <mailto:andresr at valvesoftware.com>>
>> Sent:
>> December
>> 16,
>> 2016
>> 10:00 PM
>> To:
>> Sagalovitch,
>> Serguei;
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> Subject:
>> RE:
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>>
>> Hey
>> Serguei,
>>
>> [Serguei]
>> No.
>> I
>> mean
>> pipe
>> :-)
>> as
>> MEC
>> define
>> it.
>> As
>> far
>> as I
>> understand
>> (by
>> simplifying)
>> some
>> scheduling
>> is
>> per
>> pipe.
>> I
>> know
>> about
>> the
>> current
>> allocation
>> scheme
>> but
>> I
>> do
>> not
>> think
>> that
>> it
>> is
>> ideal.
>> I
>> would
>> assume
>> that
>> we
>> need
>> to
>> switch
>> to
>> dynamical
>> partition
>> of
>> resources
>> based
>> on
>> the
>> workload
>> otherwise
>> we
>> will
>> have
>> resource
>> conflict
>> between
>> Vulkan
>> compute
>> and
>> OpenCL.
>>
>>
>> I
>> agree
>> the
>> partitioning
>> isn't
>> ideal.
>> I'm
>> hoping
>> we can
>> start
>> with a
>> solution
>> that
>> assumes
>> that
>> only
>> pipe0
>> has
>> any
>> work
>> and
>> the
>> other
>> pipes
>> are
>> idle (no
>> HSA/ROCm
>> running
>> on
>> the
>> system).
>>
>> This
>> should
>> be
>> more
>> or
>> less
>> the
>> use
>> case
>> we
>> expect
>> from VR
>> users.
>>
>> I
>> agree
>> the
>> split
>> is
>> currently
>> not
>> ideal,
>> but
>> I'd
>> like to
>> consider
>> that
>> a
>> separate
>> task,
>> because
>> making
>> it
>> dynamic
>> is
>> not
>> straight
>> forward
>> :P
>>
>> [Serguei]
>> Vulkan
>> works
>> via
>> amdgpu
>> (kernel
>> submissions)
>> so
>> amdkfd
>> will
>> be
>> not
>> involved.
>> I
>> would
>> assume
>> that
>> in
>> the
>> case
>> of
>> VR
>> we
>> will
>> have
>> one
>> main
>> application
>> ("console"
>> mode(?))
>> so
>> we
>> could
>> temporally
>> "ignore"
>> OpenCL/ROCm
>> needs
>> when
>> VR
>> is
>> running.
>>
>>
>> Correct,
>> this
>> is
>> why
>> we
>> want
>> to
>> enable
>> the
>> high
>> priority
>> compute
>> queue
>> through
>> libdrm-amdgpu,
>> so
>> that
>> we
>> can
>> expose
>> it
>> through
>> Vulkan
>> later.
>>
>> For
>> current
>> VR
>> workloads
>> we
>> have
>> 3
>> separate
>> processes
>> running
>> actually:
>>
>> 1)
>> Game
>> process
>>
>> 2) VR
>> Compositor
>> (this
>> is
>> the
>> process
>> that
>> will
>> require
>> high
>> priority
>> queue)
>>
>> 3)
>> System
>> compositor
>> (we
>> are
>> looking
>> at
>> approaches
>> to
>> remove
>> this
>> overhead)
>>
>> For
>> now I
>> think
>> it is
>> okay
>> to
>> assume
>> no
>> OpenCL/ROCm
>> running
>> simultaneously,
>> but
>> I
>> would
>> also
>> like
>> to be
>> able
>> to
>> address
>> this
>> case
>> in the
>> future
>> (cross-pipe
>> priorities).
>>
>> [Serguei]
>> The
>> problem
>> with
>> pre-emption
>> of
>> graphics
>> task:
>> (a)
>> it
>> may
>> take
>> time
>> so
>> latency
>> may
>> suffer
>>
>>
>> The
>> latency
>> is
>> our
>> main
>> concern,
>> we
>> want
>> something
>> that is
>> predictable.
>> A good
>> illustration
>> of
>> what
>> the
>> reprojection
>> scheduling
>> looks
>> like
>> can be
>> found
>> here:
>> https://community.amd.com/servlet/JiveServlet/showImage/38-1310-104754/pastedImage_3.png
>> <https://community.amd.com/servlet/JiveServlet/showImage/38-1310-104754/pastedImage_3.png>
>>
>>
>>
>>
>> (b)
>> to
>> preempt
>> we
>> need
>> to
>> have
>> different
>> "context"
>> - we
>> want
>> to
>> guarantee
>> that
>> submissions
>> from
>> the
>> same
>> context
>> will
>> be
>> executed
>> in
>> order.
>>
>>
>> This
>> is
>> okay,
>> as
>> the
>> reprojection
>> work
>> doesn't
>> have
>> dependencies
>> on
>> the
>> game
>> context,
>> and it
>> even
>> happens
>> in a
>> separate
>> process.
>>
>> BTW:
>> (a)
>> Do
>> you
>> want
>> "preempt"
>> and
>> later
>> resume
>> or
>> do
>> you
>> want
>> "preempt"
>> and
>> "cancel/abort"
>>
>>
>> Preempt
>> the
>> game
>> with
>> the
>> compositor
>> task
>> and
>> then
>> resume
>> it.
>>
>> (b)
>> Vulkan
>> is
>> generic
>> API
>> and
>> could
>> be
>> used
>> for
>> graphics
>> as
>> well
>> as
>> for
>> plain
>> compute
>> tasks
>> (VK_QUEUE_COMPUTE_BIT).
>>
>>
>> Yeah,
>> the
>> plan
>> is to
>> use
>> vulkan
>> compute.
>> But
>> if
>> you
>> figure
>> out a way
>> for
>> us to get
>> a
>> guaranteed
>> execution
>> time
>> using
>> vulkan
>> graphics,
>> then
>> I'll
>> take you
>> out
>> for a
>> beer :)
>>
>> Regards,
>> Andres
>> ________________________________________
>> From:
>> Sagalovitch,
>> Serguei
>> [Serguei.Sagalovitch at amd.com
>> <mailto:Serguei.Sagalovitch at amd.com>]
>> Sent:
>> Friday,
>> December
>> 16,
>> 2016
>> 9:13 PM
>> To:
>> Andres
>> Rodriguez;
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> Subject:
>> Re:
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>>
>> Hi
>> Andres,
>>
>> Please
>> see
>> inline
>> (as
>> [Serguei])
>>
>> Sincerely
>> yours,
>> Serguei
>> Sagalovitch
>>
>>
>> From:
>> Andres
>> Rodriguez
>> <andresr at valvesoftware.com
>> <mailto:andresr at valvesoftware.com>>
>> Sent:
>> December
>> 16,
>> 2016
>> 8:29 PM
>> To:
>> Sagalovitch,
>> Serguei;
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> Subject:
>> RE:
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>>
>> Hi
>> Serguei,
>>
>> Thanks
>> for
>> the
>> feedback.
>> Answers
>> inline
>> as [AR].
>>
>> Regards,
>> Andres
>>
>> ________________________________________
>> From:
>> Sagalovitch,
>> Serguei
>> [Serguei.Sagalovitch at amd.com
>> <mailto:Serguei.Sagalovitch at amd.com>]
>> Sent:
>> Friday,
>> December
>> 16,
>> 2016
>> 8:15 PM
>> To:
>> Andres
>> Rodriguez;
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> Subject:
>> Re:
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>>
>> Andres,
>>
>>
>> Quick
>> comments:
>>
>> 1) To
>> minimize
>> "bubbles",
>> etc.
>> we
>> need
>> to
>> "force"
>> CU
>> assignments/binding
>> to
>> high-priority
>> queue
>> when
>> it
>> will
>> be in
>> use
>> and
>> "free"
>> them
>> later
>> (we
>> do
>> not
>> want
>> forever
>> take
>> CUs
>> from
>> e.g.
>> graphic
>> task to
>> degrade
>> graphics
>> performance).
>>
>> Otherwise
>> we
>> could
>> have
>> scenario
>> when
>> long
>> graphics
>> task (or
>> low-priority
>> compute)
>> will
>> took
>> all
>> (extra)
>> CUs
>> and
>> high--priority
>> will
>> wait for
>> needed
>> resources.
>> It
>> will
>> not
>> be
>> visible
>> on
>> "NOP
>> " but
>> only
>> when
>> you
>> submit
>> "real"
>> compute
>> task
>> so I
>> would
>> recommend
>> not
>> to
>> use
>> "NOP"
>> packets
>> at
>> all for
>> testing.
>>
>> It
>> (CU
>> assignment)
>> could
>> be
>> relatively
>> easy
>> done when
>> everything
>> is
>> going
>> via
>> kernel
>> (e.g.
>> as
>> part
>> of
>> frame
>> submission)
>> but I
>> must
>> admit
>> that I
>> am
>> not sure
>> about
>> the
>> best
>> way
>> for
>> user
>> level
>> submissions
>> (amdkfd).
>>
>> [AR]
>> I
>> wasn't
>> aware
>> of
>> this
>> part
>> of
>> the
>> programming
>> sequence.
>> Thanks
>> for
>> the
>> heads up!
>> Is
>> this
>> similar
>> to
>> the
>> CU
>> masking
>> programming?
>> [Serguei]
>> Yes.
>> To
>> simplify:
>> the
>> problem
>> is
>> that
>> "scheduler"
>> when
>> deciding
>> which
>> queue
>> to
>> run
>> will
>> check
>> if
>> there
>> is
>> enough
>> resources
>> and
>> if
>> not then
>> it
>> will
>> begin
>> to
>> check
>> other
>> queues
>> with
>> lower
>> priority.
>>
>> 2) I
>> would
>> recommend
>> to
>> dedicate
>> the
>> whole
>> pipe to
>> high-priority
>> queue
>> and have
>> nothing
>> their
>> except
>> it.
>>
>> [AR]
>> I'm
>> guessing
>> in
>> this
>> context
>> you
>> mean
>> pipe
>> = queue?
>> (as
>> opposed
>> to
>> the
>> MEC
>> definition
>> of
>> pipe,
>> which
>> is a
>> grouping
>> of
>> queues).
>> I say
>> this
>> because
>> amdgpu
>> only
>> has
>> access
>> to 1
>> pipe,
>> and
>> the
>> rest
>> are
>> statically
>> partitioned
>> for
>> amdkfd
>> usage.
>>
>> [Serguei]
>> No. I
>> mean
>> pipe
>> :-)
>> as
>> MEC
>> define
>> it.
>> As
>> far as I
>> understand
>> (by
>> simplifying)
>> some
>> scheduling
>> is
>> per
>> pipe.
>> I
>> know
>> about
>> the
>> current
>> allocation
>> scheme
>> but I
>> do
>> not think
>> that
>> it
>> is
>> ideal.
>> I
>> would
>> assume
>> that
>> we
>> need
>> to
>> switch to
>> dynamical
>> partition
>> of
>> resources
>> based
>> on
>> the
>> workload
>> otherwise
>> we
>> will have
>> resource
>> conflict
>> between
>> Vulkan
>> compute
>> and
>> OpenCL.
>>
>>
>> BTW:
>> Which
>> user
>> level
>> API
>> do
>> you
>> want
>> to
>> use
>> for
>> compute:
>> Vulkan or
>> OpenCL?
>>
>> [AR]
>> Vulkan
>>
>> [Serguei]
>> Vulkan
>> works
>> via
>> amdgpu
>> (kernel
>> submissions)
>> so
>> amdkfd
>> will
>> be not
>> involved.
>> I
>> would
>> assume
>> that
>> in
>> the
>> case
>> of VR
>> we will
>> have
>> one main
>> application
>> ("console"
>> mode(?))
>> so we
>> could
>> temporally
>> "ignore"
>> OpenCL/ROCm
>> needs
>> when
>> VR is
>> running.
>>
>> we
>> will
>> not
>> be
>> able
>> to
>> provide
>> a
>> solution
>> compatible
>> with
>> GFX
>> worloads.
>>
>> I
>> assume
>> that
>> you
>> are
>> talking
>> about
>> graphics?
>> Am I
>> right?
>>
>> [AR]
>> Yeah,
>> my
>> understanding
>> is
>> that
>> pre-empting
>> the
>> currently
>> running
>> graphics
>> job
>> and
>> scheduling
>> in
>> something
>> else
>> using
>> mid-buffer
>> pre-emption
>> has
>> some
>> cases
>> where it
>> doesn't
>> work
>> well.
>> But
>> if with
>> polaris10
>> it
>> starts
>> working
>> well,
>> it
>> might
>> be a
>> better
>> solution
>> for
>> us
>> (because
>> the
>> whole
>> reprojection
>> work
>> uses
>> the
>> vulkan
>> graphics
>> stack
>> at
>> the
>> moment,
>> and
>> porting
>> it to
>> compute
>> is
>> not
>> trivial).
>>
>> [Serguei]
>> The
>> problem
>> with
>> pre-emption
>> of
>> graphics
>> task:
>> (a)
>> it may
>> take
>> time so
>> latency
>> may
>> suffer
>> (b)
>> to
>> preempt
>> we
>> need
>> to
>> have
>> different
>> "context"
>> - we want
>> to
>> guarantee
>> that
>> submissions
>> from
>> the
>> same
>> context
>> will be
>> executed
>> in order.
>> BTW:
>> (a)
>> Do
>> you
>> want
>> "preempt"
>> and
>> later
>> resume
>> or do you
>> want
>> "preempt"
>> and
>> "cancel/abort"?
>> (b)
>> Vulkan
>> is
>> generic
>> API
>> and
>> could
>> be used
>> for
>> graphics
>> as
>> well
>> as
>> for
>> plain
>> compute
>> tasks
>> (VK_QUEUE_COMPUTE_BIT).
>>
>>
>> Sincerely
>> yours,
>> Serguei
>> Sagalovitch
>>
>>
>>
>> From:
>> amd-gfx
>> <amd-gfx-bounces at lists.freedesktop.org
>> <mailto:amd-gfx-bounces at lists.freedesktop.org>>
>> on
>> behalf of
>> Andres
>> Rodriguez
>> <andresr at valvesoftware.com
>> <mailto:andresr at valvesoftware.com>>
>> Sent:
>> December
>> 16,
>> 2016
>> 6:15 PM
>> To:
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> Subject:
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in
>> amdgpu
>>
>> Hi
>> Everyone,
>>
>> This
>> RFC
>> is
>> also
>> available
>> as a
>> gist
>> here:
>> https://gist.github.com/lostgoat/7000432cd6864265dbc2c3ab93204249
>> <https://gist.github.com/lostgoat/7000432cd6864265dbc2c3ab93204249>
>>
>>
>>
>>
>>
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>> gist.github.com
>> <http://gist.github.com>
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>>
>>
>>
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>> gist.github.com
>> <http://gist.github.com>
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>>
>>
>>
>>
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>> gist.github.com
>> <http://gist.github.com>
>> [RFC]
>> Mechanism
>> for
>> high
>> priority
>> scheduling
>> in amdgpu
>>
>>
>> We
>> are
>> interested
>> in
>> feedback
>> for a
>> mechanism
>> to
>> effectively
>> schedule
>> high
>> priority
>> VR
>> reprojection
>> tasks
>> (also
>> referred
>> to as
>> time-warping)
>> for
>> Polaris10
>> running
>> on
>> the
>> amdgpu
>> kernel
>> driver.
>>
>> Brief
>> context:
>> --------------
>>
>> The
>> main
>> objective
>> of
>> reprojection
>> is to
>> avoid
>> motion
>> sickness
>> for VR
>> users in
>> scenarios
>> where
>> the
>> game
>> or
>> application
>> would
>> fail
>> to finish
>> rendering
>> a new
>> frame
>> in
>> time
>> for
>> the
>> next
>> VBLANK.
>> When
>> this
>> happens,
>> the
>> user's
>> head
>> movements
>> are
>> not
>> reflected
>> on
>> the
>> Head
>> Mounted
>> Display
>> (HMD)
>> for the
>> duration
>> of an
>> extra
>> frame.
>> This
>> extended
>> mismatch
>> between
>> the
>> inner ear
>> and the
>> eyes may
>> cause
>> the
>> user
>> to
>> experience
>> motion
>> sickness.
>>
>> The
>> VR
>> compositor
>> deals
>> with
>> this
>> problem
>> by
>> fabricating
>> a
>> new frame
>> using the
>> user's
>> updated
>> head
>> position
>> in
>> combination
>> with the
>> previous
>> frames.
>> This
>> avoids
>> a
>> prolonged
>> mismatch
>> between
>> the
>> HMD
>> output
>> and the
>> inner
>> ear.
>>
>> Because
>> of
>> the
>> adverse
>> effects
>> on
>> the
>> user,
>> we
>> require
>> high
>> confidence
>> that the
>> reprojection
>> task
>> will
>> complete
>> before
>> the
>> VBLANK
>> interval.
>> Even if
>> the
>> GFX pipe
>> is
>> currently
>> full
>> of
>> work
>> from
>> the
>> game/application
>> (which
>> is most
>> likely
>> the
>> case).
>>
>> For
>> more
>> details
>> and
>> illustrations,
>> please
>> refer
>> to the
>> following
>> document:
>> https://community.amd.com/community/gaming/blog/2016/03/28/asynchronous-shaders-evolved
>> <https://community.amd.com/community/gaming/blog/2016/03/28/asynchronous-shaders-evolved>
>>
>>
>>
>>
>>
>> Gaming:
>> Asynchronous
>> Shaders
>> Evolved
>> |
>> Community
>> community.amd.com
>> <http://community.amd.com>
>> One
>> of
>> the
>> most
>> exciting
>> new
>> developments
>> in
>> GPU
>> technology
>> over the
>> past
>> year
>> has
>> been
>> the
>> adoption
>> of
>> asynchronous
>> shaders,
>> which can
>> make
>> more
>> efficient
>> use
>> of ...
>>
>>
>>
>> Gaming:
>> Asynchronous
>> Shaders
>> Evolved
>> |
>> Community
>> community.amd.com
>> <http://community.amd.com>
>> One
>> of
>> the
>> most
>> exciting
>> new
>> developments
>> in
>> GPU
>> technology
>> over the
>> past
>> year
>> has
>> been
>> the
>> adoption
>> of
>> asynchronous
>> shaders,
>> which can
>> make
>> more
>> efficient
>> use
>> of ...
>>
>>
>>
>> Gaming:
>> Asynchronous
>> Shaders
>> Evolved
>> |
>> Community
>> community.amd.com
>> <http://community.amd.com>
>> One
>> of
>> the
>> most
>> exciting
>> new
>> developments
>> in
>> GPU
>> technology
>> over the
>> past
>> year
>> has
>> been
>> the
>> adoption
>> of
>> asynchronous
>> shaders,
>> which can
>> make
>> more
>> efficient
>> use
>> of ...
>>
>>
>> Requirements:
>> -------------
>>
>> The
>> mechanism
>> must
>> expose
>> the
>> following
>> functionaility:
>>
>> *
>> Job
>> round
>> trip
>> time
>> must
>> be
>> predictable,
>> from
>> submission
>> to
>> fence
>> signal
>>
>> *
>> The
>> mechanism
>> must
>> support
>> compute
>> workloads.
>>
>> Goals:
>> ------
>>
>> *
>> The
>> mechanism
>> should
>> provide
>> low
>> submission
>> latencies
>>
>> Test:
>> submitting
>> a NOP
>> packet
>> through
>> the
>> mechanism
>> on busy
>> hardware
>> should
>> be
>> equivalent
>> to
>> submitting
>> a NOP
>> on
>> idle
>> hardware.
>>
>> Nice
>> to have:
>> -------------
>>
>> *
>> The
>> mechanism
>> should
>> also
>> support
>> GFX
>> workloads.
>>
>> My
>> understanding
>> is
>> that
>> with
>> the
>> current
>> hardware
>> capabilities
>> in
>> Polaris10
>> we
>> will
>> not
>> be
>> able
>> to
>> provide
>> a
>> solution
>> compatible
>> with GFX
>> worloads.
>>
>> But I
>> would
>> love
>> to
>> hear
>> otherwise.
>> So if
>> anyone
>> has an
>> idea,
>> approach
>> or
>> suggestion
>> that
>> will
>> also
>> be
>> compatible
>> with
>> the
>> GFX ring,
>> please
>> let
>> us know
>> about it.
>>
>> *
>> The
>> above
>> guarantees
>> should
>> also
>> be
>> respected
>> by
>> amdkfd
>> workloads
>>
>> Would
>> be
>> good
>> to
>> have
>> for
>> consistency,
>> but
>> not
>> strictly
>> necessary
>> as
>> users
>> running
>> games
>> are
>> not
>> traditionally
>> running
>> HPC
>> workloads
>> in the
>> background.
>>
>> Proposed
>> approach:
>> ------------------
>>
>> Similar
>> to
>> the
>> windows
>> driver,
>> we
>> could
>> expose
>> a high
>> priority
>> compute
>> queue to
>> userspace.
>>
>> Submissions
>> to
>> this
>> compute
>> queue
>> will
>> be
>> scheduled
>> with
>> high
>> priority,
>> and may
>> acquire
>> hardware
>> resources
>> previously
>> in
>> use
>> by other
>> queues.
>>
>> This
>> can
>> be
>> achieved
>> by
>> taking
>> advantage
>> of
>> the
>> 'priority'
>> field in
>> the HQDs
>> and
>> could
>> be
>> programmed
>> by
>> amdgpu
>> or
>> the
>> amdgpu
>> scheduler.
>> The
>> relevant
>> register
>> fields
>> are:
>>
>> *
>> mmCP_HQD_PIPE_PRIORITY
>>
>> *
>> mmCP_HQD_QUEUE_PRIORITY
>>
>> Implementation
>> approach
>> 1 -
>> static
>> partitioning:
>> ------------------------------------------------
>>
>> The
>> amdgpu
>> driver
>> currently
>> controls
>> 8
>> compute
>> queues
>> from
>> pipe0.
>> We can
>> statically
>> partition
>> these
>> as
>> follows:
>>
>> *
>> 7x
>> regular
>>
>> *
>> 1x
>> high
>> priority
>>
>> The
>> relevant
>> priorities
>> can
>> be
>> set
>> so
>> that
>> submissions
>> to
>> the high
>> priority
>> ring
>> will
>> starve
>> the
>> other
>> compute
>> rings
>> and
>> the
>> GFX ring.
>>
>> The
>> amdgpu
>> scheduler
>> will
>> only
>> place
>> jobs
>> into
>> the high
>> priority
>> rings
>> if the
>> context
>> is
>> marked
>> as
>> high
>> priority.
>> And a
>> corresponding
>> priority
>> should be
>> added
>> to
>> keep
>> track
>> of
>> this
>> information:
>>
>> *
>> AMD_SCHED_PRIORITY_KERNEL
>>
>> * ->
>> AMD_SCHED_PRIORITY_HIGH
>>
>> *
>> AMD_SCHED_PRIORITY_NORMAL
>>
>> The
>> user
>> will
>> request
>> a
>> high
>> priority
>> context
>> by
>> setting
>> an
>> appropriate
>> flag
>> in
>> drm_amdgpu_ctx_in
>> (AMDGPU_CTX_HIGH_PRIORITY
>> or
>> similar):
>> https://github.com/torvalds/linux/blob/master/include/uapi/drm/amdgpu_drm.h#L163
>> <https://github.com/torvalds/linux/blob/master/include/uapi/drm/amdgpu_drm.h#L163>
>>
>>
>>
>>
>> The
>> setting
>> is in
>> a per
>> context
>> level
>> so
>> that
>> we can:
>> *
>> Maintain
>> a
>> consistent
>> FIFO
>> ordering
>> of all
>> submissions
>> to a
>> context
>> *
>> Create
>> high
>> priority
>> and
>> non-high
>> priority
>> contexts
>> in
>> the same
>> process
>>
>> Implementation
>> approach
>> 2 -
>> dynamic
>> priority
>> programming:
>> ---------------------------------------------------------
>>
>> Similar
>> to
>> the
>> above,
>> but
>> instead
>> of
>> programming
>> the
>> priorities
>> and
>> amdgpu_init()
>> time,
>> the
>> SW
>> scheduler
>> will
>> reprogram
>> the
>> queue
>> priorities
>> dynamically
>> when
>> scheduling
>> a task.
>>
>> This
>> would
>> involve
>> having
>> a
>> hardware
>> specific
>> callback
>> from
>> the
>> scheduler
>> to
>> set
>> the
>> appropriate
>> queue
>> priority:
>> set_priority(int
>> ring,
>> int
>> index,
>> int
>> priority)
>>
>> During
>> this
>> callback
>> we
>> would
>> have
>> to
>> grab
>> the
>> SRBM
>> mutex
>> to
>> perform
>> the
>> appropriate
>> HW
>> programming,
>> and
>> I'm
>> not
>> really
>> sure
>> if
>> that is
>> something
>> we
>> should
>> be
>> doing
>> from
>> the
>> scheduler.
>>
>> On
>> the
>> positive
>> side,
>> this
>> approach
>> would
>> allow
>> us to
>> program
>> a
>> range of
>> priorities
>> for
>> jobs
>> instead
>> of a
>> single
>> "high
>> priority"
>> value",
>> achieving
>> something
>> similar
>> to
>> the
>> niceness
>> API
>> available
>> for CPU
>> scheduling.
>>
>> I'm
>> not
>> sure
>> if
>> this
>> flexibility
>> is
>> something
>> that
>> we would
>> need for
>> our use
>> case,
>> but
>> it
>> might
>> be
>> useful
>> in
>> other
>> scenarios
>> (multiple
>> users
>> sharing
>> compute
>> time
>> on a
>> server).
>>
>> This
>> approach
>> would
>> require
>> a new
>> int
>> field in
>> drm_amdgpu_ctx_in,
>> or
>> repurposing
>> of
>> the
>> flags
>> field.
>>
>> Known
>> current
>> obstacles:
>> ------------------------
>>
>> The
>> SQ is
>> currently
>> programmed
>> to
>> disregard
>> the HQD
>> priorities,
>> and
>> instead
>> it picks
>> jobs
>> at
>> random.
>> Settings
>> from
>> the
>> shader
>> itself
>> are also
>> disregarded
>> as
>> this is
>> considered
>> a
>> privileged
>> field.
>>
>> Effectively
>> we
>> can
>> get
>> our
>> compute
>> wavefront
>> launched
>> ASAP,
>> but we
>> might
>> not
>> get the
>> time
>> we
>> need
>> on
>> the SQ.
>>
>> The
>> current
>> programming
>> would
>> have
>> to be
>> changed
>> to allow
>> priority
>> propagation
>> from
>> the
>> HQD
>> into
>> the SQ.
>>
>> Generic
>> approach
>> for
>> all
>> HW IPs:
>> --------------------------------
>>
>> For
>> consistency
>> purposes,
>> the
>> high
>> priority
>> context
>> can be
>> enabled
>> for
>> all
>> HW IPs
>> with
>> support
>> of
>> the
>> SW
>> scheduler.
>> This
>> will
>> function
>> similarly
>> to the
>> current
>> AMD_SCHED_PRIORITY_KERNEL
>> priority,
>> where
>> the
>> job
>> can jump
>> ahead of
>> anything
>> not
>> commited
>> to
>> the
>> HW queue.
>>
>> The
>> benefits
>> of
>> requesting
>> a
>> high
>> priority
>> context
>> for a
>> non-compute
>> queue
>> will
>> be
>> lesser
>> (e.g.
>> up to
>> 10s
>> of
>> wait
>> time
>> if a
>> GFX
>> command
>> is
>> stuck in
>> front of
>> you),
>> but
>> having
>> the
>> API
>> in
>> place
>> will
>> allow
>> us to
>> easily
>> improve
>> the
>> implementation
>> in
>> the
>> future
>> as
>> new
>> features
>> become
>> available
>> in new
>> hardware.
>>
>> Future
>> steps:
>> -------------
>>
>> Once
>> we
>> have
>> an
>> approach
>> settled,
>> I can
>> take
>> care
>> of the
>> implementation.
>>
>> Also,
>> once
>> the
>> interface
>> is
>> mostly
>> decided,
>> we
>> can start
>> thinking
>> about
>> exposing
>> the
>> high
>> priority
>> queue
>> through
>> radv.
>>
>> Request
>> for
>> feedback:
>> ---------------------
>>
>> We
>> aren't
>> married
>> to
>> any
>> of
>> the
>> approaches
>> outlined
>> above.
>> Our goal
>> is to
>> obtain
>> a
>> mechanism
>> that
>> will
>> allow
>> us to
>> complete
>> the
>> reprojection
>> job
>> within a
>> predictable
>> amount
>> of
>> time.
>> So if
>> anyone
>> anyone
>> has any
>> suggestions
>> for
>> improvements
>> or
>> alternative
>> strategies
>> we
>> are
>> more than
>> happy
>> to hear
>> them.
>>
>> If
>> any
>> of
>> the
>> technical
>> information
>> above
>> is also
>> incorrect,
>> feel
>> free
>> to point
>> out
>> my
>> misunderstandings.
>>
>> Looking
>> forward
>> to
>> hearing
>> from you.
>>
>> Regards,
>> Andres
>>
>> _______________________________________________
>> amd-gfx
>> mailing
>> list
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>> <https://lists.freedesktop.org/mailman/listinfo/amd-gfx>
>>
>>
>> amd-gfx
>> Info
>> Page
>> -
>> lists.freedesktop.org
>> <http://lists.freedesktop.org>
>> lists.freedesktop.org
>> <http://lists.freedesktop.org>
>> To
>> see
>> the
>> collection
>> of
>> prior
>> postings
>> to
>> the list,
>> visit the
>> amd-gfx
>> Archives.
>> Using
>> amd-gfx:
>> To
>> post
>> a
>> message
>> to all
>> the list
>> members,
>> send
>> email ...
>>
>>
>>
>> amd-gfx
>> Info
>> Page
>> -
>> lists.freedesktop.org
>> <http://lists.freedesktop.org>
>> lists.freedesktop.org
>> <http://lists.freedesktop.org>
>> To
>> see
>> the
>> collection
>> of
>> prior
>> postings
>> to
>> the list,
>> visit the
>> amd-gfx
>> Archives.
>> Using
>> amd-gfx:
>> To
>> post
>> a
>> message
>> to all
>> the list
>> members,
>> send
>> email ...
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> amd-gfx
>> mailing
>> list
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>> <https://lists.freedesktop.org/mailman/listinfo/amd-gfx>
>>
>>
>> _______________________________________________
>> amd-gfx
>> mailing list
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>> <https://lists.freedesktop.org/mailman/listinfo/amd-gfx>
>>
>>
>>
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>> <https://lists.freedesktop.org/mailman/listinfo/amd-gfx>
>>
>>
>>
>>
>> Sincerely yours,
>> Serguei Sagalovitch
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx at lists.freedesktop.org
>> <mailto:amd-gfx at lists.freedesktop.org>
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>> <https://lists.freedesktop.org/mailman/listinfo/amd-gfx>
>>
>>
>>
>>
>>
>>
>>
>> Sincerely yours,
>> Serguei Sagalovitch
>>
>>
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20170102/f11a2405/attachment-0001.html>
More information about the amd-gfx
mailing list