391 lines
6.5 KiB
C++
391 lines
6.5 KiB
C++
#include <assert.h>
|
|
|
|
void unroll1(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=0; i<100; i++)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=0; i<100; i++)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=0; i<100; i++)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=0; i<100; i++)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=0; i<100; i++)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unroll2(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=0; i<100; i+=2)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=0; i<100; i+=2)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=0; i<100; i+=2)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=0; i<100; i+=2)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=0; i<100; i+=2)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unroll3(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=0; i<100; i+=3)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=0; i<100; i+=3)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=0; i<100; i+=3)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=0; i<100; i+=3)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=0; i<100; i+=3)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unroll50(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=0; i<100; i+=50)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=0; i<100; i+=50)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=0; i<100; i+=50)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=0; i<100; i+=50)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=0; i<100; i+=50)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unroll50e(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=0; i<=100; i+=50)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=0; i<=100; i+=50)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=0; i<=100; i+=50)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=0; i<=100; i+=50)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=0; i<=100; i+=50)
|
|
sumfull += i;
|
|
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unroll100(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=0; i<100; i+=100)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=0; i<100; i+=100)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=0; i<100; i+=100)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=0; i<100; i+=100)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=0; i<100; i+=100)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
|
|
void unrolld1(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=100; i>0; i--)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=100; i>0; i--)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=100; i>0; i--)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=100; i>0; i--)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=100; i>0; i--)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unrolld2(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=100; i>0; i-=2)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=100; i>0; i-=2)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=100; i>0; i-=2)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=100; i>0; i-=2)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=100; i>0; i-=2)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unrolld3(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=100; i>0; i-=3)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=100; i>0; i-=3)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=100; i>0; i-=3)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=100; i>0; i-=3)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=100; i>0; i-=3)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unrolld50(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=100; i>0; i-=50)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=100; i>0; i-=50)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=100; i>0; i-=50)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=100; i>0; i-=50)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=100; i>0; i-=50)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unrolld50e(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=100; i>=0; i-=50)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=100; i>=0; i-=50)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=100; i>=0; i-=50)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=100; i>=0; i-=50)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=100; i>=0; i-=50)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
void unrolld100(void)
|
|
{
|
|
int sum0 = 0;
|
|
int sum2 = 0;
|
|
int sum3 = 0;
|
|
int sum10 = 0;
|
|
int sumfull = 0;
|
|
|
|
for(int i=100; i>0; i-=100)
|
|
sum0 += i;
|
|
#pragma unroll(2)
|
|
for(int i=100; i>0; i-=100)
|
|
sum2 += i;
|
|
#pragma unroll(3)
|
|
for(int i=100; i>0; i-=100)
|
|
sum3 += i;
|
|
#pragma unroll(10)
|
|
for(int i=100; i>0; i-=100)
|
|
sum10 += i;
|
|
#pragma unroll(full)
|
|
for(int i=100; i>0; i-=100)
|
|
sumfull += i;
|
|
assert(sum2 == sum0);
|
|
assert(sum3 == sum0);
|
|
assert(sum10 == sum0);
|
|
assert(sumfull == sum0);
|
|
}
|
|
|
|
|
|
char glob[20];
|
|
|
|
void autounroll(void)
|
|
{
|
|
char sum0 = 0;
|
|
char sum1 = 0;
|
|
char sum2 = 0;
|
|
char sum3 = 0;
|
|
char sum4 = 0;
|
|
|
|
for(int i=0; i<10; i++)
|
|
sum0 += glob[i];
|
|
// for(int i=10; i<20; i++)
|
|
// sum1 += glob[i - 10];
|
|
for(int i=10; i>0; i--)
|
|
sum2 += glob[i - 1];
|
|
for(int i=9; i>=0; i--)
|
|
sum3 += glob[i];
|
|
// for(int i=0; i<=9; i++)
|
|
// sum4 += glob[i];
|
|
|
|
// assert(sum1 == sum0);
|
|
assert(sum2 == sum0);
|
|
#if 0
|
|
assert(sum3 == sum0);
|
|
assert(sum4 == sum0);
|
|
#endif
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
for(int i=0; i<20; i++)
|
|
glob[i] = i;
|
|
#if 0
|
|
unroll1();
|
|
unroll2();
|
|
unroll3();
|
|
unroll50();
|
|
unroll50e();
|
|
unroll100();
|
|
unrolld1();
|
|
unrolld2();
|
|
unrolld3();
|
|
unrolld50();
|
|
unrolld50e();
|
|
unrolld100();
|
|
#endif
|
|
autounroll();
|
|
}
|