From: Paolo Bonzini <pbonzini@redhat.com>
To: vijayak@caviumnetworks.com
Cc: peter maydell <peter.maydell@linaro.org>,
vijay kilari <vijay.kilari@gmail.com>,
Prasun Kapoor <Prasun.Kapoor@caviumnetworks.com>,
knv suresh2009 <knv.suresh2009@gmail.com>,
qemu-devel@nongnu.org, qemu-arm@nongnu.org,
Suresh <ksuresh@caviumnetworks.com>, Vijay <vijayak@cavium.com>
Subject: Re: [Qemu-arm] [RFC PATCH v2 1/3] target-arm: Use Neon for zero checking
Date: Thu, 7 Apr 2016 06:30:07 -0400 (EDT) [thread overview]
Message-ID: <1303989769.499295.1460025007144.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <1460023087-31509-2-git-send-email-vijayak@caviumnetworks.com>
> +#elif defined __aarch64__
> +#include "arm_neon.h"
> +
> +#define NEON_VECTYPE uint64x2_t
> +#define NEON_LOAD_N_ORR(v1, v2) (vld1q_u64(&v1) | vld1q_u64(&v2))
Why is the load and orr necessary? Is ((v1) | (v2)) enough?
> +#define NEON_ORR(v1, v2) ((v1) | (v2))
> +#define NEON_NOT_EQ_ZERO(v1) \
> + ((vgetq_lane_u64(v1, 0) != 0) || (vgetq_lane_u64(v1, 1) != 0))
> +
> +#define BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR_NEON 16
Unless you have numbers saying that a 16-unroll is better than an 8-unroll
(and then you should put those in the commit message), you do not need to
duplicate code, just add aarch64 definitions for the existing code.
---
I've now read the rest of the patches, and you're adding prefetch code
that is ARM-specific. Please provide numbers separately for each
patch, not just in the cover letter. The cover letter is lost when the
patch is committed, while the commit messages remain.
On top of this, "With these changes, total migration time comes down
from 10 seconds to 2.5 seconds" is not a reproducible experiment.
What was the RAM size? Was the guest just booted and idle, or was
there a workload? What was the host?
Thanks,
Paolo
> +/*
> + * Zero page/buffer checking using SIMD(Neon)
> + */
> +
> +static bool
> +can_use_buffer_find_nonzero_offset_neon(const void *buf, size_t len)
> +{
> + return (len % (BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR_NEON
> + * sizeof(NEON_VECTYPE)) == 0
> + && ((uintptr_t) buf) % sizeof(NEON_VECTYPE) == 0);
> +}
> +
> +static size_t buffer_find_nonzero_offset_neon(const void *buf, size_t len)
> +{
> + size_t i;
> + NEON_VECTYPE qword0, qword1, qword2, qword3, qword4, qword5, qword6;
> + uint64_t const *data = buf;
> +
> + if (!len) {
> + return 0;
> + }
> +
> + assert(can_use_buffer_find_nonzero_offset_neon(buf, len));
> + len /= sizeof(unsigned long);
> +
> + for (i = 0; i < len; i += BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR_NEON)
> {
> + qword0 = NEON_LOAD_N_ORR(data[i], data[i + 2]);
> + qword1 = NEON_LOAD_N_ORR(data[i + 4], data[i + 6]);
> + qword2 = NEON_LOAD_N_ORR(data[i + 8], data[i + 10]);
> + qword3 = NEON_LOAD_N_ORR(data[i + 12], data[i + 14]);
> + qword4 = NEON_ORR(qword0, qword1);
> + qword5 = NEON_ORR(qword2, qword3);
> + qword6 = NEON_ORR(qword4, qword5);
> +
> + if (NEON_NOT_EQ_ZERO(qword6)) {
> + break;
> + }
> + }
> +
> + return i * sizeof(unsigned long);
> +}
> +
> +static inline bool neon_support(void)
> +{
> + /*
> + * Check if neon feature is supported.
> + * By default neon is supported for aarch64.
> + */
> + return true;
Then everything below this function is not necessary.
Paolo
> +}
> +
> +bool can_use_buffer_find_nonzero_offset(const void *buf, size_t len)
> +{
> + return neon_support() ? can_use_buffer_find_nonzero_offset_neon(buf,
> len) :
> + can_use_buffer_find_nonzero_offset_inner(buf, len);
> +}
> +
> +size_t buffer_find_nonzero_offset(const void *buf, size_t len)
> +{
> + return neon_support() ? buffer_find_nonzero_offset_neon(buf, len) :
> + buffer_find_nonzero_offset_inner(buf, len);
> +}
> #else
> bool can_use_buffer_find_nonzero_offset(const void *buf, size_t len)
> {
> --
> 1.7.9.5
>
>
WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com>
To: vijayak@caviumnetworks.com
Cc: peter maydell <peter.maydell@linaro.org>,
vijay kilari <vijay.kilari@gmail.com>,
Prasun Kapoor <Prasun.Kapoor@caviumnetworks.com>,
knv suresh2009 <knv.suresh2009@gmail.com>,
qemu-devel@nongnu.org, qemu-arm@nongnu.org,
Suresh <ksuresh@caviumnetworks.com>, Vijay <vijayak@cavium.com>
Subject: Re: [Qemu-devel] [RFC PATCH v2 1/3] target-arm: Use Neon for zero checking
Date: Thu, 7 Apr 2016 06:30:07 -0400 (EDT) [thread overview]
Message-ID: <1303989769.499295.1460025007144.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <1460023087-31509-2-git-send-email-vijayak@caviumnetworks.com>
> +#elif defined __aarch64__
> +#include "arm_neon.h"
> +
> +#define NEON_VECTYPE uint64x2_t
> +#define NEON_LOAD_N_ORR(v1, v2) (vld1q_u64(&v1) | vld1q_u64(&v2))
Why is the load and orr necessary? Is ((v1) | (v2)) enough?
> +#define NEON_ORR(v1, v2) ((v1) | (v2))
> +#define NEON_NOT_EQ_ZERO(v1) \
> + ((vgetq_lane_u64(v1, 0) != 0) || (vgetq_lane_u64(v1, 1) != 0))
> +
> +#define BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR_NEON 16
Unless you have numbers saying that a 16-unroll is better than an 8-unroll
(and then you should put those in the commit message), you do not need to
duplicate code, just add aarch64 definitions for the existing code.
---
I've now read the rest of the patches, and you're adding prefetch code
that is ARM-specific. Please provide numbers separately for each
patch, not just in the cover letter. The cover letter is lost when the
patch is committed, while the commit messages remain.
On top of this, "With these changes, total migration time comes down
from 10 seconds to 2.5 seconds" is not a reproducible experiment.
What was the RAM size? Was the guest just booted and idle, or was
there a workload? What was the host?
Thanks,
Paolo
> +/*
> + * Zero page/buffer checking using SIMD(Neon)
> + */
> +
> +static bool
> +can_use_buffer_find_nonzero_offset_neon(const void *buf, size_t len)
> +{
> + return (len % (BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR_NEON
> + * sizeof(NEON_VECTYPE)) == 0
> + && ((uintptr_t) buf) % sizeof(NEON_VECTYPE) == 0);
> +}
> +
> +static size_t buffer_find_nonzero_offset_neon(const void *buf, size_t len)
> +{
> + size_t i;
> + NEON_VECTYPE qword0, qword1, qword2, qword3, qword4, qword5, qword6;
> + uint64_t const *data = buf;
> +
> + if (!len) {
> + return 0;
> + }
> +
> + assert(can_use_buffer_find_nonzero_offset_neon(buf, len));
> + len /= sizeof(unsigned long);
> +
> + for (i = 0; i < len; i += BUFFER_FIND_NONZERO_OFFSET_UNROLL_FACTOR_NEON)
> {
> + qword0 = NEON_LOAD_N_ORR(data[i], data[i + 2]);
> + qword1 = NEON_LOAD_N_ORR(data[i + 4], data[i + 6]);
> + qword2 = NEON_LOAD_N_ORR(data[i + 8], data[i + 10]);
> + qword3 = NEON_LOAD_N_ORR(data[i + 12], data[i + 14]);
> + qword4 = NEON_ORR(qword0, qword1);
> + qword5 = NEON_ORR(qword2, qword3);
> + qword6 = NEON_ORR(qword4, qword5);
> +
> + if (NEON_NOT_EQ_ZERO(qword6)) {
> + break;
> + }
> + }
> +
> + return i * sizeof(unsigned long);
> +}
> +
> +static inline bool neon_support(void)
> +{
> + /*
> + * Check if neon feature is supported.
> + * By default neon is supported for aarch64.
> + */
> + return true;
Then everything below this function is not necessary.
Paolo
> +}
> +
> +bool can_use_buffer_find_nonzero_offset(const void *buf, size_t len)
> +{
> + return neon_support() ? can_use_buffer_find_nonzero_offset_neon(buf,
> len) :
> + can_use_buffer_find_nonzero_offset_inner(buf, len);
> +}
> +
> +size_t buffer_find_nonzero_offset(const void *buf, size_t len)
> +{
> + return neon_support() ? buffer_find_nonzero_offset_neon(buf, len) :
> + buffer_find_nonzero_offset_inner(buf, len);
> +}
> #else
> bool can_use_buffer_find_nonzero_offset(const void *buf, size_t len)
> {
> --
> 1.7.9.5
>
>
next prev parent reply other threads:[~2016-04-07 10:30 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-07 9:58 [Qemu-arm] [RFC PATCH v2 0/3] ARM64: Live migration optimization vijayak
2016-04-07 9:58 ` [Qemu-devel] " vijayak
2016-04-07 9:58 ` [Qemu-arm] [RFC PATCH v2 1/3] target-arm: Use Neon for zero checking vijayak
2016-04-07 9:58 ` [Qemu-devel] " vijayak
2016-04-07 10:30 ` Paolo Bonzini [this message]
2016-04-07 10:30 ` Paolo Bonzini
2016-04-07 10:44 ` [Qemu-arm] " Peter Maydell
2016-04-07 10:44 ` [Qemu-devel] " Peter Maydell
2016-04-07 10:44 ` [Qemu-arm] " Peter Maydell
2016-04-07 10:44 ` [Qemu-devel] " Peter Maydell
2016-04-09 22:45 ` [Qemu-arm] " Richard Henderson
2016-04-09 22:45 ` Richard Henderson
2016-04-11 10:40 ` Peter Maydell
2016-04-11 10:40 ` Peter Maydell
2016-04-07 9:58 ` [Qemu-arm] [RFC PATCH v2 2/3] utils: Add cpuinfo helper to fetch /proc/cpuinfo vijayak
2016-04-07 9:58 ` [Qemu-devel] " vijayak
2016-04-07 10:11 ` [Qemu-arm] " Peter Maydell
2016-04-07 10:11 ` [Qemu-devel] " Peter Maydell
2016-04-07 10:56 ` [Qemu-arm] " Vijay Kilari
2016-04-07 10:56 ` [Qemu-devel] " Vijay Kilari
2016-04-07 11:45 ` [Qemu-arm] " Peter Maydell
2016-04-07 11:45 ` [Qemu-devel] " Peter Maydell
2016-04-08 6:21 ` [Qemu-arm] " Vijay Kilari
2016-04-08 6:21 ` [Qemu-devel] " Vijay Kilari
2016-04-08 9:43 ` [Qemu-arm] " Peter Maydell
2016-04-08 9:43 ` [Qemu-devel] " Peter Maydell
2016-04-11 6:52 ` [Qemu-arm] " Vijay Kilari
2016-04-11 6:52 ` [Qemu-devel] " Vijay Kilari
2016-04-11 9:37 ` [Qemu-arm] " Suzuki K Poulose
2016-04-11 9:37 ` [Qemu-devel] " Suzuki K Poulose
2016-04-13 9:54 ` [Qemu-arm] " Vijay Kilari
2016-04-13 9:54 ` [Qemu-devel] " Vijay Kilari
2016-04-13 9:59 ` Suzuki K Poulose
2016-04-13 9:59 ` Suzuki K Poulose
2016-05-09 3:30 ` [Qemu-arm] " Vijay Kilari
2016-05-09 3:30 ` [Qemu-devel] " Vijay Kilari
2016-05-09 10:59 ` [Qemu-arm] " Suzuki K Poulose
2016-05-09 10:59 ` [Qemu-devel] " Suzuki K Poulose
2016-05-09 11:21 ` [Qemu-arm] " Peter Maydell
2016-05-09 11:21 ` [Qemu-devel] " Peter Maydell
2016-05-09 13:44 ` Catalin Marinas
2016-05-09 13:44 ` Catalin Marinas
2016-05-10 10:24 ` Will Deacon
2016-05-10 10:24 ` Will Deacon
2016-05-10 13:06 ` [Qemu-arm] " Catalin Marinas
2016-05-10 13:06 ` [Qemu-devel] " Catalin Marinas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1303989769.499295.1460025007144.JavaMail.zimbra@redhat.com \
--to=pbonzini@redhat.com \
--cc=Prasun.Kapoor@caviumnetworks.com \
--cc=knv.suresh2009@gmail.com \
--cc=ksuresh@caviumnetworks.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vijay.kilari@gmail.com \
--cc=vijayak@cavium.com \
--cc=vijayak@caviumnetworks.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.