Dot product and helper methods

The dot product of two vectors using C++ can now be implemented. All the code should be placed in the native-lib.cpp file. Starting from Armv8.4a, the dot product is part of the new instruction set. This corresponds to some Cortex-A75 designs and all Cortex-A76 designs onwards. See Exploring the Arm dot product instructions for more information.

We start with the helper method that generates the ramp, which is the vector of 16-bit integers incremented from the code startValue:

short* generateRamp(short startValue, short len) {
	short* ramp = new short[len];
	for(short i = 0; i < len; i++) {
    		ramp[i] = startValue + i;
	}
	return ramp;
}

We implement the msElapsedTime and now methods, which are used later to determine the code execution time:

double msElapsedTime(chrono::system_clock::time_point start) {
	auto end = chrono::system_clock::now();
	return chrono::duration_cast<chrono::milliseconds>(end - start).count();
}

chrono::system_clock::time_point now() {
	return chrono::system_clock::now();
}
</chrono::milliseconds>

The msElapsedTime method calculates the amount of time, expressed in milliseconds, that has passed from a starting point. The now method is a handy wrapper for the std::chrono::system_clock::now method, which returns the current time.

Now create the actual dot product method. To calculate a dot product of two equal-length vectors, multiply vectors element-by-element, then accumulate the resulting products. Here you can see a straightforward implementation of this algorithm:

int dotProduct(short* vector1, short* vector2, short len) {
	int result = 0;
 
	for(short i = 0; i < len; i++) {
    	    result += vector1[i] * vector2[i];
	}
 
	return result;
}

The previous implementation uses a for loop. So, we sequentially multiply vector elements and then accumulate the resulting products in a local variable called result.

Previous Next