Я пытаюсь использовать cudaMalloc и cudaMemcpy для выделения динамической памяти, но во время работы возникает ошибка Segmentation Fault. Я думаю, что никогда не выделяю память для двойных *данных для устройства, но не знаю, как это сделать правильно.
Вот код:#include
#include
#include
#include
#define cugo(ans) gpu::execute_cuda_runtime((ans), __FILE__, __LINE__)
namespace calcu {
namespace cpu {
class Nuclide {
public:
int Z_;
int A_;
int Diff_;
std::vector data;
Nuclide(int Z, int A, int Diff) : Z_(Z), A_(A), Diff_(Diff) {}
};
std::vector nuclides;
}
namespace gpu {
struct gpuNuclide {
int Z_;
int A_;
double *data;
};
gpuNuclide* nuclides = nullptr; // Device pointer
void execute_cuda_runtime(cudaError_t code, const char* fname, int line)
{
if (code != cudaSuccess) {
std::cerr data.push_back(6908.0);
cpu::nuclides.push_back(std::make_unique(94, 240, 99999));
cpu::nuclides[2]->data.push_back(0.0001);
cpu::nuclides[2]->data.push_back(0.10006);
// Allocate memory on the device for all nuclides
cugo(cudaMalloc(&gpu::nuclides, cpu::nuclides.size() * sizeof(gpu::gpuNuclide)));
// Copy each data element one by one from host to device
for (size_t i = 0; i < cpu::nuclides.size(); ++i) {
cugo(cudaMemcpy(&gpu::nuclides.Z_, &cpu::nuclides->Z_, sizeof(int), cudaMemcpyHostToDevice));
cugo(cudaMemcpy(&gpu::nuclides.A_, &cpu::nuclides->A_, sizeof(int), cudaMemcpyHostToDevice));
// Treatments for vector
cugo(cudaMalloc(&gpu::nuclides.data, cpu::nuclides->data.size() * sizeof(double)));
cugo(cudaMemcpy(gpu::nuclides.data, cpu::nuclides->data.data(), cpu::nuclides->data.size() * sizeof(double), cudaMemcpyHostToDevice));
}
// Call kernel function
gpu::test_print_kernel(gpu::nuclides);
cugo(cudaDeviceSynchronize());
// Free device memory
cugo(cudaFree(gpu::nuclides));
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... n-a-struct