C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C++使用类调用CUDA核函数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

C++使用类调用CUDA核函数

 

本项目包括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 DX)

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

#pragma once

#include "kernel.cuh"

#include <iostream>
using namespace std;

#define DX 200


class CTest
{
public:
    int *a;
    int *b;
    int *c;

    void SetParameter();
    void AddNum();
    void Show();
    void Evolution();
};

void CTest::SetParameter()
{
    cudaMallocManaged(&a,sizeof(int) * DX);
    cudaMallocManaged(&b,sizeof(int) * DX);
    cudaMallocManaged(&c,sizeof(int) * DX);

    for (int f = 0; f<DX; f++)
    {
        a[f] = f;
        b[f] = f + 1;
    }

}

void CTest::AddNum()
{
    AddKernel(a,b,c,DX);
}

void CTest::Show()
{
    cout << " a     b    c"  << endl;

    for (int f = 0; f<DX; f++)
    {
        cout << a[f] << " + " << b[f] << "  = " << c[f] << endl;
    }
}

void CTest::Evolution()
{
    SetParameter();
    AddNum();
    Show();
}

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

#include "add.h"

void main()
{
    CTest cTest;

    cTest.Evolution();

    system("pause");
}

3、kernel.cuh文件定义一个接口函数AddKernel(int *a,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 DX)
{
    int f = blockIdx.x*blockDim.x + threadIdx.x;

    if (f >= DX) return;

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

}

void AddKernel(int *a,int DX)
{
    dim3 dimBlock = (128);
    dim3 dimGrid = ((DX + 128 - 1) / 128);
    Add << <dimGrid,dimBlock >> > (a,DX);
    cudaDeviceSynchronize();
}

部分结果:

C++使用类调用CUDA核函数

@H_630_301@

大佬总结

以上是大佬教程为你收集整理的C++使用类调用CUDA核函数全部内容,希望文章能够帮你解决C++使用类调用CUDA核函数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: