PHP调用cuda,C++使用类调用CUDA核函数

正如CUDA C所称,CUDA对C语言进行了很好的扩展,直接使用C语言可以非常简单方便的调用CUDA核函数。但是当想使用C++的类成员函数直接调用核函数是不可行的,第一,核函数不能作为类的成员函数,第二,C++的cpp文件和CUDA的cu文件分别经由g++和nvcc编译,当两种代码混合就会编译出错。

因而C++的类和CUDA结合使用需要进行一层封装,借用两个数组相加的例子说明,主要过程如下:

3a7a61a02aab4683c507f2916306377c.png

本项目包括4文件,如上图所示,分别为:add.h、add.cpp、kernel.cuh、kernel.cu。在add.h中封装一个函数AddNum(),调用kernel.cuh中的函数

AddKernel(int *a, int *b, int *c, int DX),然后在kernel.cu文件中使用AddKernel(...)调用相加核函数Add(int *a, int *b, int *c, intDX)

1、add.h文件定义了一个CTest的类,包括3个指针(数组)、4个函数。

#pragma once#include"kernel.cuh"#include

using namespacestd;#define DX 200

classCTest

{public:int *a;int *b;int *c;voidSetParameter();voidAddNum();voidShow();voidEvolution();

};voidCTest::SetParameter()

{

cudaMallocManaged(&a, sizeof(int) *DX);

cudaMallocManaged(&b, sizeof(int) *DX);

cudaMallocManaged(&c, sizeof(int) *DX);for (int f = 0; f

{

a[f]=f;

b[f]= f + 1;

}

}voidCTest::AddNum()

{

AddKernel(a, b, c, DX);

}voidCTest::Show()

{

cout<< "a b c" <

{

cout<< a[f] << "+" << b[f] << "=" << c[f] <

}

}voidCTest::Evolution()

{

SetParameter();

AddNum();

Show();

}

2、add.cpp文件执行主函数,创建一个CTest的对象cTest,然后调用Evolution执行相加操作。

#include "add.h"

voidmain()

{

CTest cTest;

cTest.Evolution();

system("pause");

}

3、kernel.cuh文件定义一个接口函数AddKernel(int *a, int *b, int *c, int DX);

#include "cuda_runtime.h"#include"device_launch_parameters.h"

void AddKernel(int *a, int *b, int *c, int DX);

4、kernel.cu包括相加Add核函数以及调用核函数的封装函数AddKernel.

#include "kernel.cuh"__global__void Add(int *a, int *b, int *c, intDX)

{int f = blockIdx.x*blockDim.x +threadIdx.x;if (f >= DX) return;

c[f]= a[f] +b[f];

}void AddKernel(int *a, int *b, int *c, intDX)

{

dim3 dimBlock= (128);

dim3 dimGrid= ((DX + 128 - 1) / 128);

Add<< > >(a, b, c, DX);

cudaDeviceSynchronize();

}

部分结果:

0a7064ab3b10ba2e5b09174a3edb51d2.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值