我用可以绘制简单金字塔的一定数量的像素实现了屏幕表示(通过为屏幕中的每个像素分配RBG值)。在学习CUDA C时,我想重新实现它以在GPU中分配这些值,但是要为一个结构体正确分配内存却很复杂。
我已经在CPU上尝试过此操作:
#include <stdlib.h>
#include <stdio.h>
typedef struct {
unsigned char r;
unsigned char g;
unsigned char b;
} Pixel;
typedef struct {
unsigned int width;
unsigned int height;
Pixel* pxp ;
} Screen;
Screen* newScreen(int width, int height){
Screen *sc=malloc(sizeof(Screen));
sc->width=width;
sc->height=height;
sc->pxp=malloc(width*height*sizeof(Pixel));
return sc;
}
void removeScreen(Screen* sc){
free(sc->pxp);
free(sc);
}
void drawPrmd(Screen *sc){
for(long int i=0;i<sc->height;i++){
int index=(int) (i*sc->width +sc->width/2);
for(long int j=index;j>=index-i;j--){
if((j< (sc->height*sc->width))&&(j>0)){
sc->pxp[j].r=255;
sc->pxp[j].b=255;
sc->pxp[j].g=255;
}
}
for(long int j=index;j<=index+i;j++){
if((j< (sc->height*sc->width))&&(j>0)){
sc->pxp[j].r=255;
sc->pxp[j].b=255;
sc->pxp[j].g=255;
}
}
}
}
void printScreen(Screen * sc){
for(int i=0;i<sc->height;i++){
for(int j=0;j<sc->width;j++){
printf("(%u) \t",sc->pxp[i*sc->width+j].r);
}
printf("\n");
}
}
int main(){
Screen *sc1=newScreen(80,80);
drawPrmd(sc1);
printScreen(sc1);
removeScreen(sc1);
}
当尝试将其实现在GPU上运行时,我在分配GPU内存时遇到了问题:
Screen* newScreenGPU(int width, int height){
Screen *sc;
if(cudaMalloc((void **) &sc,sizeof(Screen))!=cudaSuccess)
printf("Error allocating GPU memory for screen \n");
if(cudaMalloc((void **) sc->pxp,width * height*sizeof(Pixel))!=cudaSuccess)
printf("Error allocating GPU memory for pixels \n");
return sc;
}
**它可以顺利编译,但我得到的Segmentation fault (core dumped)
恰好是像素的内存分配(第二个分配)。
-预期:分配内存并为像素分配RGB值。 -实际结果:分段错误(核心已转储)。