#include <amsculib3/amsculib3.hpp>

namespace amscuda
{

__global__ void test_cuarray_sum_kf(cuarray<float> *dq1, float *sum)
{
    int I;
    *sum = 0.0f;
    for(I=0;I<dq1->length;I++)
    {
        *sum = *sum + dq1->data[I];
    }
    //*sum = (float)dq1->length;
    return;
}

float test_cuarray_sum(cuarray<float> *q1)
{
    float ret = 0.0f;
    int res;
    cuarray<float> *dq1 = NULL;
    float *dsum;
    cudaError_t err = cudaSuccess;

    cudaMalloc(&dsum,sizeof(float));
    res = q1->device_send(&dq1);
    printf("error: res=%d\n",res);
    test_cuarray_sum_kf<<<1,1>>>(dq1,dsum);
    cudaDeviceSynchronize();

    err = cudaGetLastError();
    if(err!=cudaSuccess)
    {
        printf("test_cuarray_sum Error: %s\n",cudaGetErrorString(err));
    }

    cudaMemcpy(&ret,dsum,sizeof(float),cudaMemcpyDeviceToHost);

    q1->device_free(&dq1);
    cudaFree(dsum); dsum = NULL;

    return ret;
}

void test_cuarray()
{
    cuarray<float> q1;
    
    int I;

    q1.resize(100);
    for(I=0;I<q1.length;I++)
    {
        q1.data[I] = I;
    }
    printf("q1.length=%d\n",q1.length);

    printf("sum of array: %1.6g\n",test_cuarray_sum(&q1));

}

};
