Cuda C ++: Mallo c класс на устройстве и заполнение его данными с хоста - PullRequest
1 голос
/ 24 февраля 2020

Моя цель - «заполнить» класс, который находится в памяти устройства от хоста. Поскольку этот класс содержит указатель на данные, я понимаю, что после выделения самого класса мне нужно выделить место для него отдельно, а затем изменить указатель класса устройства на теперь выделенный указатель. Я пытался сориентировать свое решение в соответствии с этой записью, которая, на мой взгляд, кажется, делает именно то, что я хочу, однако я делаю что-то не так и поэтому хотел бы помочь.

У меня есть следующие настройки классов и соответствующий код:

class A {
public:
    HostB host_B;
    B *dev_B;
    void moveBToGPU();
}

class HostB {
public:
    vector<int> info;
}

class B {
public:
    int *info;
}

void A::moveBToGPU() {
    cudaMalloc(this->dev_B, sizeof(B));

    int* dev_data;
    cudaMalloc(&dev_data, sizeof(int) * host_B->info.size());

    cudaMemcpy(&this->dev_B->info, &dev_data, sizeof(int *), cudaMemcpyHostToDevice); //Not sure if correct

    //I would like to do the following, but that results in a segfault
    cudaMemcpy(this->dev_B->info, host_B->info.data(), host_B->info.size(), cudaMemcpyHostToDevice);

    //As expected, this works
    cudaMemcpy(dev_data, host_B->info.data(), host_B->info.size(), cudaMemcpyHostToDevice;

1 Ответ

3 голосов
/ 24 февраля 2020

Просто избавьтесь от линии, вызывающей ошибку сегмента. Строка, которая идет после того, как она делает то, что вы хотите, правильно. Segfault возникает из-за того, что это: this->dev_B->info требует разыменования указателя устройства в коде хоста (недопустимо), тогда как это: dev_data не делает. Также обратите внимание, что вы, вероятно, хотите умножить host_B->info.size() на sizeof(int), как вы делали с cudaMalloc

. Вот пример. Ваш опубликованный код не может быть скомпилирован, в нем было много ошибок (в moveBToGPU) Я не собираюсь перечислять все ошибки компиляции. Пожалуйста, ознакомьтесь с приведенным ниже примером изменений:

$ cat t1676.cu
#include <cstdio>
#include <vector>
using namespace std;
class HostB {
public:
    vector<int> info;
};

class B {
public:
    int *info;
};

class A {
public:
    HostB host_B;
    B *dev_B;
    void moveBToGPU();
};

__global__ void k(A a){

  printf("%d\n",a.dev_B->info[0]);
}

void A::moveBToGPU() {
    cudaMalloc(&dev_B, sizeof(B));

    int* dev_data;
    cudaMalloc(&dev_data, sizeof(int) * host_B.info.size());

    cudaMemcpy(&dev_B->info, &dev_data, sizeof(int *), cudaMemcpyHostToDevice); //Not sure if correct


    //As expected, this works
    cudaMemcpy(dev_data, host_B.info.data(), sizeof(int)*host_B.info.size(), cudaMemcpyHostToDevice);
}

int main(){

  A a;
  a.host_B.info.push_back(12);
  a.moveBToGPU();
  k<<<1,1>>>(a);
  cudaDeviceSynchronize();
}
$ nvcc -o t1676 t1676.cu
$ cuda-memcheck ./t1676
========= CUDA-MEMCHECK
12
========= ERROR SUMMARY: 0 errors
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...