я Тринг построить Cuda программы, чтобы сделать лучевое, и у меня есть некоторый код ниже:cudaMalloc не работает при попытке создать пользовательский тип структуры
void build_world(World *w, RGBAColor* buffer){
w->vp = (ViewPlane*) malloc(sizeof(ViewPlane));
w->vp->hres = 512;
w->vp->vres = 512;
w->vp->buffer = buffer;
w->vp->s = 1;
ViewPlane *viewplane;
cudaMalloc(&viewplane,sizeof(ViewPlane)); //return cudaSuccess but pointer still NULL
cudaMemcpy(viewplane,w->vp,sizeof(ViewPlane),cudaMemcpyHostToDevice);
free(w->vp);
w->vp = viewplane;
cudaMalloc(&(w->background_color),sizeof(RGBAColor)); //return cudaSuccess but pointer still NULL
*(w->background_color) = black; //Memory access error
cudaMalloc(&(w->sphere),sizeof(Sphere)); //return cudaSuccess but pointer still NULL
w->sphere->center = Point3D(0.0,0.0,0.0);
w->sphere->radius = 300;
}
World * W представляет собой статическое глобальным указатель, и он находится в глобальной памяти. Моя проблема в том, что я не могу выделить память в памяти устройства, все вызовы «cudaMalloc» не работают большую часть времени.
я делать то, что @RobertCrovella предложил в комментарии, как это:
void build_world(World *w, RGBAColor* buffer){
checkCudaErrors(cudaMalloc(&(w->vp),sizeof(ViewPlane)));
getLastCudaError("viewplane allocate failed");
w->vp->hres = 512; //memory access errors occurs here
w->vp->vres = 512;
w->vp->buffer = buffer;
w->vp->s = 1;
checkCudaErrors(cudaMalloc(&(w->background_color),sizeof(RGBAColor)));
getLastCudaError("background allocate failed");
*(w->background_color) = black;
checkCudaErrors(cudaMalloc(&(w->sphere),sizeof(Sphere)));
getLastCudaError("sphere allocate failed");
w->sphere->center = Point3D(0.0,0.0,0.0);
w->sphere->radius = 300;
}
и он работает сразу ... cudaMalloc API еще возвращает "cudaSuccess", когда это не так.
здесь определения структуры:
typedef float3 Point3D;
typedef uchar4 RGBAColor;
struct Sphere{
Point3D center;
float radius;
};
struct ViewPlane{
public:
int hres;
int vres;
float s;
//float gamma;
//float inv_gamma;
RGBAColor *buffer;
};
struct World{
public:
ViewPlane *vp;
RGBAColor *background_color;
Sphere *sphere;
};
после рассмотрения вопросов, которые @RobertCrovella упоминает в ответ ниже, вот третья версия build_world:
struct World{
public:
ViewPlane *vp;
RGBAColor background_color;
Sphere *sphere;
};
void build_world(World *w, RGBAColor* buffer){
World *h_world;
h_world = (World*)malloc(sizeof(World));
ViewPlane *h_vp = (ViewPlane*)malloc(sizeof(ViewPlane));
h_vp->hres = 512;
h_vp->vres = 512;
h_vp->buffer = buffer;
h_vp->s = 1;
checkCudaErrors(cudaMalloc(&(h_world->vp),sizeof(ViewPlane)));
getLastCudaError("viewplane allocate failed");
checkCudaErrors(cudaMemcpy(h_world->vp,h_vp,sizeof(ViewPlane),cudaMemcpyHostToDevice));
getLastCudaError("viewplane memory copy failed");
h_world->background_color = black;
Sphere *h_sphere = (Sphere*)malloc(sizeof(Sphere));
h_sphere->center = Point3D(0.0,0.0,0.0);
h_sphere->radius = 300;
checkCudaErrors(cudaMalloc(&(h_world->sphere),sizeof(Sphere)));
getLastCudaError("sphere allocate failed");
checkCudaErrors(cudaMemcpy(h_world->sphere,h_sphere,sizeof(Sphere),cudaMemcpyHostToDevice));
getLastCudaError("sphere memory copy failed");
checkCudaErrors(cudaMalloc(&w , sizeof(World)));
getLastCudaError("world allocate failed");
checkCudaErrors(cudaMemcpy(w,h_world,sizeof(World),cudaMemcpyHostToDevice));
getLastCudaError("world memory copy failed");
free(h_world);free(h_vp);free(h_sphere);
}
это время, все вызовы cudaMemcpy
не работают: при работе до конца этой функции значение h_vp
и h_sphere
хорошее; h_world->vp
и h_world->sphere
указывают на область устройства, но содержат неправильное значение; w
не имеет правильного значения, весь указатель содержит 0x00000000 ...
1. do [проверка ошибки cuda] (http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime -api) во всех вызовах cuda и вызовах ядра 2. сообщать о конкретной строке, в которой происходят ошибки (-ы), и о конкретном сообщении об ошибке, которое отображается, когда вы проверяете ошибку cuda на этой строке 3. предоставлять всю соответствующую структуру/класс определения, такие как «Мир» в этом случае. –
работает, когда я делаю «checkCudaErrors» ко всем «cudaMalloc», почему? – Clones1201
@RobertCrovella он работает только один раз ... – Clones1201