Data.h
#pragma once
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
class Data
{
public:
Data();
~Data();
float * h_a;
float * h_b;
float * h_c;
float * h_d;
float * d_a;
float * d_b;
float * d_c;
float * d_d;
int size = 10; /** 变量长度 */
//分配资源
void allocateResource();
//初始化相关参数
void init();
//内存拷贝
void memcpyHost2Device();
//内存拷贝
void memcpyDevice2Host();
//释放资源
void releaseResource();
};
data.cpp
#include "Data.h"
#include <iostream>
using namespace std;
Data::Data()
{
}
Data::~Data()
{
}
void Data::allocateResource()
{
h_a = (float*)malloc(sizeof(float)*size);
h_b = (float*)malloc(sizeof(float)*size);
h_c = (float*)malloc(sizeof(float)*size);
h_d = (float*)malloc(sizeof(float)*size);
cudaMalloc(&d_a, sizeof(float)*size);
cudaMalloc(&d_b, sizeof(float)*size);
cudaMalloc(&d_c, sizeof(float)*size);
cudaMalloc(&d_d, sizeof(float)*size);
}
void Data::init()
{
for (int i = 0; i < size; i++)
{
h_a[i] = i; h_b[i] = i; h_c[i] = i; h_d[i] = i;
}
}
void Data::memcpyHost2Device()
{
cudaMemcpy(d_a, h_a, sizeof(float)*size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, h_b, sizeof(float)*size, cudaMemcpyHostToDevice);
cudaMemcpy(d_c, h_c, sizeof(float)*size, cudaMemcpyHostToDevice);
cudaMemcpy(d_d, h_d, sizeof(float)*size, cudaMemcpyHostToDevice);
}
void Data::memcpyDevice2Host()
{
cudaMemcpy(h_a,d_a, sizeof(float)*size, cudaMemcpyDeviceToHost);
cudaMemcpy(h_b,d_b, sizeof(float)*size, cudaMemcpyDeviceToHost);
cudaMemcpy(h_c,d_c, sizeof(float)*size, cudaMemcpyDeviceToHost);
cudaMemcpy(h_d,d_d, sizeof(float)*size, cudaMemcpyDeviceToHost);
}
void Data::releaseResource()
{
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
cudaFree(d_d);
free(h_a);
free(h_b);
free(h_c);
free(h_d);
}
kernel.cu
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <iostream>
#include "Data.h"
__global__ void multiply(float c[],float d[])
{
printf("执行Step1\n");
}
__global__ void add(float a[],float b[])
{
printf("执行Step2\n");
}
void main()
{
//创建流
cudaStream_t stream1;
cudaStreamCreate(&stream1);
//初始化设备
Data data;
data.allocateResource();
data.init();
add << <1, data.size,0,stream1>> > (data.d_a, data.d_b); //控制先执行
multiply << <1, data.size, 0, stream1 >> > (data.d_c, data.d_d); //控制后执行
cudaStreamSynchronize(stream1);
data.releaseResource();
cudaStreamDestroy(stream1);
cudaDeviceReset();
system("pause");
return;
}
输出结果,add会在multiply之前执行。
参考《GPU高性能编程CUDA实战》
补充:Data类可以作为模板使用