Просто избавьтесь от линии, вызывающей ошибку сегмента. Строка, которая идет после того, как она делает то, что вы хотите, правильно. 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
$