簡體   English   中英

在 Cuda 內核中使用 C++ 對象和類成員

[英]Using c++ objects and class members inside a Cuda kernel

我是 C++ 的新手,尤其是 Cuda 計算工具。 我正在嘗試使用 Cuda 在 GPU 上並行化我的代碼,為了我的目的,必須能夠從類創建對象或至少從內核調用它們的成員。

首先這里是我的類的定義:

//Header
#pragma once
#include<cuda.h>
#include<cuda_runtime.h>
#include<cuda_runtime_api.h>
#include<stdio.h>
#include<iostream>

class Ding
{
private:
    int index;
    double vector_1[100];
    double vector_2[100];
    double prop;

public:
    __host__ __device__ Ding(int);
    __host__ __device__ ~Ding();

    __device__ void calculate_stuff(double, int);
    __device__ double get_prop();
};

//Source
#include "Ding.h"
#include <math.h>

__host__ __device__ Ding::Ding(int ind) {
    index = ind;
    prop = 1;
    for (int ii = 0; ii < 100; ii++) {
        vector_1[ii] = (4 * ii + ind) / (ind + ii + 1);
        vector_2[ii] = (-2.14 * ii + ind) / (2*ind + ii + 1);
    }
}

__host__ __device__ Ding::~Ding() {};

__device__ void Ding::calculate_stuff(double coeff, int N) {
    prop = 1;

    for (int ii = 0; ii < N; ii++) {
        for (int jj = 0; jj < 100; jj++) {
            prop += pow(-1, ii) * vector_1[jj] * vector_2[jj]*coeff;
        }
    }
}

__device__ double Ding::get_prop() {
    return prop;
}

正如你所看到的,除了執行一些毫無意義的計算之外,它沒有什么可做的,因為這應該僅作為我如何使用 Cuda 運行此代碼的示例。

現在這里是主要的源文件:

#include<cuda.h>
#include<cuda_runtime.h>
#include<cuda_runtime_api.h>
#include "device_launch_parameters.h"
#include<stdio.h>
#include<iostream>
#include "Ding.h"

using namespace std;

__global__ void some_kernel(double *vec_a, Ding* teil, int size) {
    int ii = blockIdx.x * blockDim.x + threadIdx.x;

    if (ii < size) {
        vec_a[ii] += teil[ii].get_prop();
        vec_a[ii] += ii;
    }
}

int main() {
    double* vec_1, * d_vec_1;
    int N = 300;
    double result = 0;
    Ding* teil;
    Ding* d_teil;

    vec_1 = (double*)malloc(N * sizeof(double));
    teil = (Ding*)malloc(N * sizeof(Ding));
    for (int ii = 0; ii < N; ii++) {
        vec_1[ii] = 0;
        teil[ii] = Ding::Ding(ii);
    }

    cudaMalloc(&d_vec_1, N * sizeof(double));
    cudaMalloc(&d_teil, N * sizeof(Ding));

    cudaMemcpy(d_vec_1, vec_1, N * sizeof(double), cudaMemcpyHostToDevice);
    cudaMemcpy(d_teil, teil, N * sizeof(Ding), cudaMemcpyHostToDevice);


    some_kernel <<< 256/N + 1, 256 >>> (d_vec_1, d_teil,  N);

    for (int ii = 0; ii < N; ii++) {
        result += vec_1[ii];
    }
    
    cout << "Old result: " << result << endl;

    cudaMemcpy(vec_1, d_vec_1, N * sizeof(double), cudaMemcpyDeviceToHost);
    
    result = 0;

    for (int ii = 0; ii < N; ii++) {
        result += vec_1[ii];
    }

    cout << "New result: " << result << endl;
}

我從主機創建了一組對象並將其復制到設備。 在設備上,僅調用參數“prop”的 getter 並將該值添加到向量 vec_a。 所以基本上代碼在沒有從設備調用類成員時工作。 所以如果我注釋掉這一行:

vec_a[ii] += teil[ii].get_prop();

代碼有效,但一旦任何班級成員開始發揮作用,我就會收到以下錯誤,不幸的是我無法理解:

Fehler MSB3721 Der Befehl ""C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.4\\bin\\nvcc.exe" -gencode=arch=compute_52,code=sm_52 --use-local-env -ccbin "C :\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\bin\\HostX86\\x64" -x cu -I"C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA \\v11.4\\include" -I"C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.4\\include" -G --keep-dir x64\\Debug -maxrregcount=0 --machine 64 -cuda - cudart static -g -D_DEBUG -D_CONSOLE -D_UNICODE -DUNICODE -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64\\Debug\\vc142.pdb /FS /Zi /RTC1 /MDd " -o x64\\Debug\\File.cu. obj "C:\\Users\\ronal\\source\\repos\\Basic_Cuda_Test\\Basic_Cuda_Test\\File.cu"" wurde mit Code 255 bedet。 Basic_Cuda_Test C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\MSBuild\\Microsoft\\VC\\v160\\BuildCustomizations\\CUDA 11.4.targets 785

從這條消息中可以看出,我使用的是 Cuda v11.4 和 Microsoft Visual Studio 2019。在沒有訪問類成員的情況下,計算已成功執行,因此 Cuda 的東西似乎可以正常工作。 這就是為什么我認為到目前為止所有東西都已正確安裝和配置。 最好的情況是我也可以在設備上創建對象,但現在我很高興能以某種方式在設備上使用類成員。 可能這個問題很基本。

我期待着您的回答和解決方案。

從給出的代碼來看,我假設您有一些文件Ding.cu ,其中包含Ding的實現。 為了能夠從不同的編譯單元(內核在main.cu實現)調用設備函數,必須生成可重定位的設備代碼。 使用編譯器標志--rdc=true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM