[llvm-dev] Is the RVV used correctly?

Craig Topper via llvm-dev llvm-dev at lists.llvm.org
Mon Jun 14 21:06:35 PDT 2021


We don't support the subscript operator directly on RVV vectors because we
don't know how many elements can fit in a register. The *a1 and *a2 will
try to read an entire register worth of data, but there is no guarantee
that 5 ints will fit in a register. It might only fit 4. You'll need an
outer loop to handle that case. A more correct version looks something like
this

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<riscv_vector.h>

int main(){
int input1[5] = {0,1,2,4,6};
int input2[5] = {0,1,2,4,6};
int *input1ptr = input1;
int *input2ptr = input2;

int elts = 5;
do {
// Ask hardware how many elements we can read at once.
int vl = vsetvl_e32m1(5);
vint32m1_t a1 = vle32_v_i32m1(input1ptr, vl);
vint32m1_t a2 = vle32_v_i32m1(input2ptr, vl);
vint32m1_t bb = vadd_vv_i32m1(a1, a2, vl);

for (int i=0;i<vl;i++) {
// Shift element to lsbs.
vint32m1_t shift = vslidedown_vx_i32m1(vundefined_i32m1(), bb, i, vl);
// Extract element 0 and print.
printf("%d\n",vmv_x_s_i32m1_i32(shift));
}

// Decrement elts by number read;
elts -= vl;
// Increment by pointers by the number read.
input1ptr += vl;
input2ptr += vl;
} while (elts != 0);

return 1;

}

~Craig


On Mon, Jun 14, 2021 at 9:25 PM liao via llvm-dev <llvm-dev at lists.llvm.org>
wrote:

> Is RVV used correctly in this way? If so, are there any suggestions for
> code implementation?
>
> testcase:
>
> #include<stdio.h>
>
> #include<stdlib.h>
>
> #include<math.h>
>
> #include<riscv_vector.h>
>
> int main(){
>
>  int input1[5] = {0,1,2,4,6};
>
>  int input2[5] = {0,1,2,4,6};
>
>  vint32m1_t *a1 = (vint32m1_t *)input1;
>
>  vint32m1_t *a2 = (vint32m1_t *)input2;
>
>  vint32m1_t bb;
>
>  int vl = vsetvl_e32m1(10000);
>
>  bb = vadd_vv_i32m1( *a1, *a2, vl);
>
>  for (int i=0;i<5;i++)
>
>    printf("%d\n",bb[i]);
>
>  return 1;
>
> }
>
>
> error:
>
> clang --target=riscv64-unknown-linux-gnu   -march=rv64gcv0p10
>  -menable-experimental-extensions  --sysroot=xxx  --gcc-toolchain=xxx test.c
>
> Error:
>
> test.c:14:20: error: subscripted value is not an array, pointer, or vector
>
>    printf("%d\n",bb[i]);
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210614/590dd460/attachment.html>


More information about the llvm-dev mailing list