Anonymous
Как выделить память в структуре в CUDA?
Сообщение
Anonymous » 11 фев 2025, 21:50
Я новичок в CUDA, и я хочу создать простой проект CUDA, который использует структуру, которая содержит поле Size_t и поле массива Int. < /p>
Вот код. Выделение не удается на поле «Биты».
Код: Выделить всё
#include "z_cu_t.cuh"
int main()
{
z_t z = z_init(2);
z_cu_t* z_cu;
cudaMalloc(&z_cu, sizeof(z_cu_t));
z_cu_from_z(z_cu, &z); //Segmentation fault here
z_free(&z);
z_cu_free(z_cu);
cudaFree(z_cu);
return 0;
}
< /code>
z_cu_t.cu
#include
#include
#include "z_cu_t.cuh"
__global__ void z_cu_free(z_cu_t* z)
{
cudaFree(z->bits);
z->bits = 0;
z->size = 0;
}
void z_cu_from_z(z_cu_t* to, z_t const* from)
{
cudaMemcpy(&to->size, &from->size, sizeof(size_t), cudaMemcpyHostToDevice);
printf("OK\n");
cudaMalloc(&to->bits, sizeof(int) * from->size); //Segmentation fault here
printf("KO\n");
cudaMemcpy(to->bits, from->bits, sizeof(int) * from->size, cudaMemcpyHostToDevice);
}
void z_from_z_cu(z_t* to, z_cu_t const* from)
{
cudaMemcpy(&to->size, &from->size, sizeof(size_t), cudaMemcpyDeviceToHost);
cudaMalloc(&to->bits, sizeof(int) * to->size);
cudaMemcpy(to->bits, from->bits, sizeof(int) * to->size, cudaMemcpyDeviceToHost);
}
< /code>
z_cu_t.cuh
#ifndef Z_CU_T_H
#define Z_CU_T_H
struct z_cu_t_struct
{
int* bits;
size_t size;
};
typedef struct z_cu_t_struct z_cu_t;
__global__ void z_cu_free(z_cu_t* z);
extern "C"
{
#include "z_t.h"
}
void z_cu_from_z(z_cu_t* to, z_t const* from);
void z_from_z_cu(z_t* to, z_cu_t const* from);
#endif // Z_CU_T_H
< /code>
z_t.c
#include
#include
#include "z_t.h"
z_t z_init(size_t size)
{
z_t z;
z.size = size;
z.bits = malloc(sizeof(int) * size);
memset(z.bits, 0, sizeof(int) * size);
return z;
}
void z_free(z_t* z)
{
free(z->bits);
z->bits = 0;
z->size = 0;
}
< /code>
z_t.h
#ifndef Z_T_H
#define Z_T_H
struct z_t_struct
{
int* bits;
size_t size;
};
typedef struct z_t_struct z_t;
z_t z_init(size_t size);
void z_free(z_t* z);
#endif // Z_T_H
< /code>
Затем я компилируюсь и компилируется и ссылкой проект: < /p>
nvcc -c main.cu
nvcc -rdc=true -c z_cu_t.cu
nvcc z_t.o main.o z_cu_t.o -o main
< /code>
Выход: < /p>
OK
Segmentation error (core dumped)
< /code>
он сбои на строке 18 "z_cu_t.cu": < /p>
cudaMalloc(&to->bits, sizeof(int) * from->size); //Segmentation fault here
Я не знаю, что не так.
Подробнее здесь:
https://stackoverflow.com/questions/794 ... re-in-cuda
1739299847
Anonymous
Я новичок в CUDA, и я хочу создать простой проект CUDA, который использует структуру, которая содержит поле Size_t и поле массива Int. < /p> Вот код. Выделение не удается на поле «Биты».[code]#include "z_cu_t.cuh" int main() { z_t z = z_init(2); z_cu_t* z_cu; cudaMalloc(&z_cu, sizeof(z_cu_t)); z_cu_from_z(z_cu, &z); //Segmentation fault here z_free(&z); z_cu_free(z_cu); cudaFree(z_cu); return 0; } < /code> z_cu_t.cu #include #include #include "z_cu_t.cuh" __global__ void z_cu_free(z_cu_t* z) { cudaFree(z->bits); z->bits = 0; z->size = 0; } void z_cu_from_z(z_cu_t* to, z_t const* from) { cudaMemcpy(&to->size, &from->size, sizeof(size_t), cudaMemcpyHostToDevice); printf("OK\n"); cudaMalloc(&to->bits, sizeof(int) * from->size); //Segmentation fault here printf("KO\n"); cudaMemcpy(to->bits, from->bits, sizeof(int) * from->size, cudaMemcpyHostToDevice); } void z_from_z_cu(z_t* to, z_cu_t const* from) { cudaMemcpy(&to->size, &from->size, sizeof(size_t), cudaMemcpyDeviceToHost); cudaMalloc(&to->bits, sizeof(int) * to->size); cudaMemcpy(to->bits, from->bits, sizeof(int) * to->size, cudaMemcpyDeviceToHost); } < /code> z_cu_t.cuh #ifndef Z_CU_T_H #define Z_CU_T_H struct z_cu_t_struct { int* bits; size_t size; }; typedef struct z_cu_t_struct z_cu_t; __global__ void z_cu_free(z_cu_t* z); extern "C" { #include "z_t.h" } void z_cu_from_z(z_cu_t* to, z_t const* from); void z_from_z_cu(z_t* to, z_cu_t const* from); #endif // Z_CU_T_H < /code> z_t.c #include #include #include "z_t.h" z_t z_init(size_t size) { z_t z; z.size = size; z.bits = malloc(sizeof(int) * size); memset(z.bits, 0, sizeof(int) * size); return z; } void z_free(z_t* z) { free(z->bits); z->bits = 0; z->size = 0; } < /code> z_t.h #ifndef Z_T_H #define Z_T_H struct z_t_struct { int* bits; size_t size; }; typedef struct z_t_struct z_t; z_t z_init(size_t size); void z_free(z_t* z); #endif // Z_T_H < /code> Затем я компилируюсь и компилируется и ссылкой проект: < /p> nvcc -c main.cu nvcc -rdc=true -c z_cu_t.cu nvcc z_t.o main.o z_cu_t.o -o main < /code> Выход: < /p> OK Segmentation error (core dumped) < /code> он сбои на строке 18 "z_cu_t.cu": < /p> cudaMalloc(&to->bits, sizeof(int) * from->size); //Segmentation fault here [/code] Я не знаю, что не так. Подробнее здесь: [url]https://stackoverflow.com/questions/79430105/how-to-allocate-memory-in-structure-in-cuda[/url]