Home > Back-end >  C Vectorization: Is it possible to do elementwise operation in array like python-vectorization?
C Vectorization: Is it possible to do elementwise operation in array like python-vectorization?

Time:07-14

I am moving from python to C, in the hope of faster implementation, and trying to learn vectorization in C equivalent to python vectorization. For example, assume that we have binary array Input_Binary_Array, if I want to multiply each element for the index, say, i, by 2**i and then sum all non-zero, in python-vectorization we do the following:

case 1 : Value = (2. ** (np.nonzero(Input_Binary_Array)[0]   1)).sum()

Or if we do slicing and do elementwise addition/subtraction/multiplication, we do the following:

case 2 : Array_opr= (Input_Binary_Array[size:] * 2**Size -Input_Binary_Array[:-size])

C is a powerful low-level language, so simple for/while loop is quite faster, but I am not sure that there are no equivalent vectorizations like python.

So, my question is, is there an explicit vectorization code for:

1.

multiplying all elements of an array

with a constant number (scalar)

2.

elementwise addition, subtraction, division for 2 given arrays of same size.

3.

slicing, summing, cumulative summing

or, the simple for, while loop is the only faster option to do above operations like python vectorization (case 1, 2)?

CodePudding user response:

The answer is to either use a library to achieve those things, or write one. The C language by itself is fairly minimalist. It's part of the appeal. Some libraries out there include the Intel MLK, and there's gsl, which has that along with huge number of other functions, and more.

Now, with that said, I would recommend that if moving from Python to C is your plan, moving from Python to C is the better one. The reason that I say this is because C already has a lot of the tools you would be looking for to build what you like syntactically.

Specifically, you want to look at C std::vector, iterators, ranges and lambda expressions, all within C 20 and working rather well. I was able to make my own iterator on my own sort of weird collection and then have Linq style functions tacked onto it, with Linq semantics...

So I could say

mycollection<int> myvector = { 1, 2, 4, 5 };

Something like that anyway - the initializer expression rules I forget sometimes.

auto v = mycollection
.where( []( auto& itm ) { itm > 3; } )
.sum( []( auto& itm ) { return itm; } );

and get more or less what I expect.

Since you control the iterator down to every single detail you could ever want (and the std framework already thought of many), you can make it go as fast as you need, use multiple cores and so on.

In fact, I think STL for MS and maybe GCC both actually have swap in parallel algorithms where you just use them.

So C is good, but consider C , if you are going that "C like" route. Because that's the only way you'll get the performance you want with the syntax you need.

Iterators basically let you wrap the concept of a for loop as an object. So,

CodePudding user response:

So, my question is, is there an explicit vectorization code for:

1.

multiplying all elements of an array

with a constant number (scalar)

The C language itself does not have a syntax for expressing that with a single simple statement. One would ordinarily write a loop to perform the multiplication element by element, or possibly find or write a library that handles it.

Note also that as far as I am aware, the Python language does not have this either. In particular, the product of a Python list and an integer n is not scalar multiplication of the list elements, but rather a list with n times as many elements. Some of your Python examples look like they may be using Numpy, which can provide for that sort of thing, but that's a third-party package, analogous to a library in C.

elementwise addition, subtraction, division for 2 given arrays of same size.

Same as above. Including this not being in Python, either, at least not as the effect of any built-in Python operator on objects of a built-in type.

slicing, summing, cumulative summing

C has limited array slicing, in that you can access contiguous subarrays of an array more or less as arrays in their own right. The term "slice" is not typically used, however.

C does not have built-in sum() functions for arrays.

or, the simple for, while loop is the only faster option to do above operations like python vectorization (case 1, 2)?

There are lots and lots of third-party C libraries, including some good ones for linear algebra. The C language and standard library does not have such features built in. One would typically choose among writing explicit loops, writing a custom library, and integrating a third party library based on how much your code relies on such operations, whether you need or can benefit from customization to your particular cases, and whether the operations need to be highly optimized.

  • Related