Member 12606956 Ответов: 0

Как запустить эту программу cuda?


#include <stdio.h>
#include <cuda.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <math.h>
//#include<conio.h>
#define N 100
float A[N][N];
int i,j,it,n;
float t_1;
float x[N],z[N],e[N],zmax,emax;
#define MAX_RANGE 9999

#define funcCheck(stmt) do {                                                    \
        cudaError_t err = stmt;                                               \
        if (err != cudaSuccess) {                                             \
            printf( "Failed to run stmt %d ", __LINE__);                       \
            printf( "Got CUDA error ...  %s ", cudaGetErrorString(err));    \
            return -1;                                                        \
        }                                                                     \
    } while(0)

// Compute eign values and vector
__global__ void eignvShared(float * A, float * C, 
                                    int numARows, int numAColumns,int numCRows, int numCColumns) 
{
    __shared__ float sA[32][32];   // Tile size of 32x32 

    int Row = blockDim.y*blockIdx.y + threadIdx.y;
    int Col = blockDim.x*blockIdx.x + threadIdx.x;
    float Cvalue = 0.0;
    sA[threadIdx.y][threadIdx.x] = 0.0;

    for (int k = 0; k < (((numAColumns - 1)/ 32) + 1); k++)
    {
        if ( (Row < numARows) && (threadIdx.x + (k*32)) < numAColumns)
        {
            sA[threadIdx.y][threadIdx.x] = A[(Row*numAColumns) + threadIdx.x + (k*32)];
        }
        else
        {
            sA[threadIdx.y][threadIdx.x] = 0.0;
        }            
        __syncthreads();
//////////////////////////////////////
//////////////////////////////////////
        for (int j = 0; j < 32; ++j)
        {
            Cvalue += sA[threadIdx.y][j] ;
        }
    }
    if ( Col < numAColumns)
    {
        C[numAColumns + Col] = Cvalue;
    }
}

void eignvOnHost(float * A, float * C,  int numARows,
                        int numAColumns,int numCRows, int numCColumns)
{
printf("\nEnter the column vector\n");
     scanf("%d",&n);
for(i=1; i<=N; i++)
    { 
        x[i]=A[i][n];
    }
///
for(it=0;it<100; it++)
 {
        for(i=1; i<=N; i++)
        {
            z[i]=0;
            for(j=1; j<=N; j++)
            {
                z[i]=z[i]+A[i][j]*x[j];
            }
        }
        zmax=fabs(z[1]);
        for(i=2; i<=N; i++)
        {
            if((fabs(z[i]))>zmax)
                zmax=fabs(z[i]);
        }
        for(i=1; i<=N; i++)
        {
            z[i]=z[i]/zmax;
        }
        for(i=1; i<=N; i++)
        {
            e[i]=0;
            e[i]=fabs((fabs(z[i]))-(fabs(x[i])));
        }
        emax=e[1];
        for(i=2; i<=N; i++)
        {
            if(e[i]>emax)
                emax=e[i];
        }
        for(i=1; i<=N; i++)
        {
            x[i]=z[i];
        }
    }
///
    
    return;
}

int main(int argc, char ** argv) {
    float * hostA; // The A matrix
    float * hostC; // The output C 
    float * hostComputedC;
    float * deviceA;
    float * deviceC;
clock_t c_1,c_2;
    // Please adjust rows and columns according to you need.
    int numARows = 512; // number of rows in the matrix A
    int numAColumns = 512; // number of columns in the matrix A
    int numCRows; // number of rows in the matrix C (you have to set this)
    int numCColumns; // number of columns in the matrix C (you have to set this)
c_1=time(NULL); // time measure: start mm
    hostA = (float *) malloc(sizeof(float)*numARows*numAColumns);

    for (int i = 0; i < numARows*numAColumns; i++)
    {
        hostA[i] = (rand() % MAX_RANGE) / 2.0;
    }
  // Setting numCRows and numCColumns
    numCRows =1;
    numCColumns = numAColumns;

   hostC = (float *) malloc(sizeof(float)*numCRows*numCColumns);    
   hostComputedC = (float *) malloc(sizeof(float)*numCRows*numCColumns);    

    // Allocating GPU memory
    funcCheck(cudaMalloc((void **)&deviceA, sizeof(float)*numARows*numAColumns));
    funcCheck(cudaMalloc((void **)&deviceC, sizeof(float)*numCRows*numCColumns));

    // Copy memory to the GPU 
    funcCheck(cudaMemcpy(deviceA, hostA, sizeof(float)*numARows*numAColumns, cudaMemcpyHostToDevice));
    // Initialize the grid and block dimensions 
    dim3 dimBlock(32, 32, 1);    
    dim3 dimGrid((numCColumns/32) + 1, (numCRows/32) + 1, 1);

    //@@ Launch the GPU Kernel here
    eignvShared<<<dimGrid, dimBlock>>>(deviceA, deviceC, numARows, numAColumns, numCRows, numCColumns);    

    cudaError_t err1 = cudaPeekAtLastError();
    cudaDeviceSynchronize();
    printf( "Got CUDA error ... %s \n", cudaGetErrorString(err1));

    // Copy the results in GPU memory back to the CPU    
    funcCheck(cudaMemcpy(hostC, deviceC, sizeof(float)*numCRows*numCColumns, cudaMemcpyDeviceToHost));

    eignvOnHost(hostA,  hostComputedC, numARows, numAColumns,numCRows, numCColumns);

    for (int i=0; i < numCColumns*numCRows; i++)
    {
        if (hostComputedC[i]  != hostC[i] )
        {
            printf("Mismatch at  Col = %d hostComputed[] = %f --device[] %f\n",  i % numCColumns, hostComputedC[i], hostC[i]);
            break;
        }
    }
    // Free the GPU memory
    funcCheck(cudaFree(deviceA));    
    funcCheck(cudaFree(deviceC));    

    free(hostA);
    free(hostC);
    free(hostComputedC);
c_2=time(NULL); 
t_1 = (float)(c_2-c_1); 
printf("Execution time: %f \n",t_1);
    return 0;
}


Что я уже пробовал:

как я могу запустить эту программу cuda?
у меня есть linux ubuntu
и visual stodio 2010
он вычисляет собственное значение и собственный вектор
пожалуйста, помогите мне

Sergey Alexandrovich Kryukov

Как бежать? - не по теме. Это сайт для разработчиков программного обеспечения, инженеров.
—СА

Patrice T

Учебник для CUDA ? Нет примера ?

Richard MacCutchan

Вам нужно построить его на вашей системе Linux.

chandanadhikari

здесь не подобает задавать вопросы подобным образом. Пожалуйста, уточните, с какой проблемой вы сталкиваетесь при запуске этой программы ... какое сообщение об ошибке вы получаете и т. д. и т. д. ... эта информация поможет нам помочь вам лучше !!

Member 12606956

Когда я запускаю его, появляется ошибка: выражение должно иметь указатель на тип объекта ...

chandanadhikari

сообщение уже дает некоторое объяснение ... вам нужно выяснить, на какой номер строки указывает это сообщение об ошибке, и исправить ошибку

0 Ответов