I have following code to accomplish prefix sum task:
#include <iostream>
#include<math.h>
using namespace std;
int Log(int n){
int count=1;
while (n!=0){
n>>=1;
count++;
}
return count;
}
int main(){
int x[16]={39,21,20,50,13,18,2,33,49,39,47,15,30,47,24,1};
int n=sizeof(x)/sizeof(int );
for (int i=0;i<=(Log(n)-1);i++){
for (int j=0;j<=n-1;j++){
if (j>=(std::powf(2,i))){
int t=powf(2,i);
x[j]=x[j]+x[j-t];
}
}
}
for (int i=0;i<n;i++)
cout<<x[i]<< " ";
return 0;
}
From this wikipedia page
but i have got wrong result what is wrong? please help
The quickest way to get your algorithm working: Drop the outer
for(i...)loop, instead settingito 0, and use only the innerfor (j...)loop.Or equivalently:
…which is the intuitive way to do a prefix sum, and also probably the fastest non-parallel algorithm.
Wikipedia’s algorithm is designed to be run in parallel, such that all of the additions are completely independent of each other. It reads all the values in, adds to them, then writes them back into the array, all in parallel. In your version, when you execute x[j]=x[j]+x[j-t], you’re using the x[j-t] that you just added to,
titerations ago.If you really want to reproduce Wikipedia’s algorithm, here’s one way, but be warned it will be much slower than the intuitive way above, unless you are using a parallelizing compiler and a computer with a whole bunch of processors.
Side notes: You can use
1<<iinstead ofpowf(2,i), for speed. And as ergosys mentioned, yourLog()function needs work; the values it returns are too high, which won’t affect the partial sum’s result in this case, but will make it take longer.