# Basic summation of vectors for R

Hi

Im trying make my first cuda program which I would like to run from R. The program is very simple, I want to pass two integer vectors from R of length 10 (arbitrarily chosen number), and return the sum.
I have been looking at this tutorial and tried to replicate the setup: http://blog.revolutionanalytics.com/2015/01/parallel-programming-with-gpus-and-r.html

My code:

``````#include <cuda.h>
#include <stdlib.h>
#include<Rinternals.h>

// treat it as C code
extern "C" {
SEXP vadd(SEXP x, SEXP y, SEXP z);
}

__global__ void add( int *a, int *b, int *c )
{
int tid = blockIdx.x;
// handle the data at this index
if (tid < 10)
c[tid] = a[tid] + b[tid];
}

SEXP vadd(SEXP x, SEXP y, SEXP z) {

// Turn vectors into C objects
int *h_x = INTEGER(x);
int *h_y = INTEGER(y);
int *h_z = INTEGER(y);

// Create pointers for device
int *dev_x, *dev_y, *dev_z; // Pointer for the device (GPU)

// Allocate memory on GPU
cudaMalloc( (void**)&dev_x, 10 * sizeof(int) );
cudaMalloc( (void**)&dev_y, 10 * sizeof(int) );
cudaMalloc( (void**)&dev_z, 10 * sizeof(int) );

// Copy vectors x, y and z to GPU
cudaMemcpy( dev_x, h_x, 10 * sizeof(int), cudaMemcpyHostToDevice );
cudaMemcpy( dev_y, h_y, 10 * sizeof(int), cudaMemcpyHostToDevice );
cudaMemcpy( dev_z, h_z, 10 * sizeof(int), cudaMemcpyHostToDevice );

// Run code

// Load result back from GPU
cudaMemcpy( z, dev_z, 10 * sizeof(int), cudaMemcpyDeviceToHost );

cudaFree( dev_x );
cudaFree( dev_y );
cudaFree( dev_z );

return ScalarInteger(h_z);
}
``````

I get the compile error:

``````vec_add.cu(55): error: argument of type "int *" is incompatible with parameter of type "int"

1 error detected in the compilation of "/tmp/tmpxft_00001bec_00000000-9_vec_add.cpp1.ii".
``````

By using the following compile command:

``````nvcc -g -arch=sm_35 -I/usr/share/R/include/ --shared -Xcompiler -fPIC -o vec_add.so vec_add.cu
``````

I’m not sure if this is the case, but on line 26 you have this declaration:
int *dev_x, *dev_y, *dev_z;

Should this be:
int* dev_x, dev_y, dev_z; //???

It might be that you’ve declared a pointer to a pointer, and de-referencing it gives back not the expected type (int), but a pointer (int*)?

Good luck,

M

No, it should not be that.