CUDA初始化与核函数

转自:https://blog.csdn.net/sunmc1204953974/article/details/51016816

#include <stdio.h>
#include <cuda_runtime.h>
#include <math.h>

#define DATA_SIZE 1048576

int data[DATA_SIZE];

void GenerateNumbers(int *number, int size) {
    for (int i = 0; i < size; i++) {
        number[i] = rand() % 10;
    }

}



bool init_cuda() {

    int count;
    cudaGetDeviceCount(&count);


    if (count == 0) {
        fprintf(stderr, "There is no device.\n");
        return false;
    }

    int i;
    for ( i = 0; i < count; i++)
    {
        cudaDeviceProp prop;    //CUDA device properties
        if (cudaGetDeviceProperties(&prop, i) == cudaSuccess) {
            if (prop.major >= 1)//prop.major 和 prop.minor 分别代表装置支持的版本号码,例如 6.5 则 prop.major 为 6 而prop.minor 为 5
                break;//确保版本号大于1
        }
    }

    if (i == count) {
        fprintf(stderr, "There is no device support CUDA 1.x");
        return false;
    }

    cudaSetDevice(i);
    return true;
}

/*
    在 CUDA 中,在函数前面加上__global__ 表示这个函式是要在显示芯片上执行的,

    所以我们只要在正常函数之前加上一个__global__就行了

    【注意】显示芯片上执行的程序,不能有返回值!
*/
__global__ static void sumofSquares(int *num, int *result) {

    int sum = 0;
    for (int i = 0; i < DATA_SIZE; i++) {

        sum += num[i] * num[i] * num[i];
    }
    *result = sum;

}


int main() {

    if (!init_cuda()) {
        fprintf(stderr, "Cuda init failed!!");
        return 0;
    }
    printf("CUDA initialized.\n");

    //生成随机数
    GenerateNumbers(data, DATA_SIZE);


    //把数据复制到显卡内存
    int *gpudata, *result;

    //在显卡中分配一块大小为 sizeof(int)*DATA_SIZE 的内存
    cudaMalloc((void**)&gpudata, sizeof(int)*DATA_SIZE);//&gpudata代表指针gpudata的地址----(void**)是类型转换
    cudaMalloc((void**)&result, sizeof(int));

    cudaMemcpy(gpudata, data, sizeof(int)*DATA_SIZE, cudaMemcpyHostToDevice);
            // dst ,    src----把CPU中的data 传到 GPU中的gpudata

    // 在CUDA 中执行函数 语法:函数名称<<<block 数目, thread 数目, shared memory 大小>>>(参数...);
    sumofSquares <<<1, 1, 0 >>> (gpudata, result);

    int sum;

    cudaMemcpy(&sum, result, sizeof(int), cudaMemcpyDeviceToHost);

    //Free

    cudaFree(gpudata);
    cudaFree(result);

    printf("GpuSum = %d\n", sum);

    sum = 0;
    for (int i = 0; i < DATA_SIZE; i++) {
        sum += data[i] * data[i] * data[i];
    }

    printf("CpuSum = %d\n", sum);
    getchar();
    return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_32095699/article/details/80861185