Namespaces
Variants
Views
Actions

Restricted pointer

From cppreference.com
< c‎ | keyword
Revision as of 09:40, 12 May 2014 by Newatthis (Talk | contribs)

Keywords

restrict

Example

To verify the 15% savings in this matrix-vector product, remove "restrict" from function Axb.

#include <stdio.h>
#include <time.h>
 
/*
#define restrict
*/
 
// Ax = b
// Arrays A, x, and b could be aliased, so restrict pointers.
void Axb (float * restrict A, float * restrict x, float * restrict b, int n)
         __attribute__ ((noinline));
 
void Axb (float * restrict A, float * restrict x, float * restrict b, int n)
{
  int i;
  for (i=0; i<n/5; i++)
  {
    b[0] =  A[0]*x[0] +  A[1]*x[1] +  A[2]*x[2] +  A[3]*x[3] +  A[4]*x[4];
    b[1] =  A[5]*x[0] +  A[6]*x[1] +  A[7]*x[2] +  A[8]*x[3] +  A[9]*x[4];
    b[2] = A[10]*x[0] + A[11]*x[1] + A[12]*x[2] + A[13]*x[3] + A[14]*x[4];
    b[3] = A[15]*x[0] + A[16]*x[1] + A[17]*x[2] + A[18]*x[3] + A[19]*x[4];
    b[4] = A[20]*x[0] + A[21]*x[1] + A[22]*x[2] + A[23]*x[3] + A[24]*x[4];
    A += 25;
    b += 5;
  }
}
 
/*    A    *  x   ==>    b    */
/* 50000x5 * 5x1  ==> 50000x1 */
#define NROW 50000
#define NCOL 5
float A[NROW*NCOL], x[NCOL], b[NROW];
 
int main(void)
{
    // Initialize matrix A and vector x.
    int i;
    for (i=0; i<NCOL; ++i) x[i] = 1;
    for (i=0; i<NROW*NCOL; ++i) A[i] = i;
 
    clock_t t = clock();   // start clock
    for (i=0; i<10000; ++i)
        Axb(A,x,b,NROW);
    t = clock()-t;         // stop clock
    printf("Time used: %f seconds\n", ((float)t)/CLOCKS_PER_SEC);
 
    return 0;
}

Possible output:

Time used: 1.880000 seconds