CUDA C为结构体分配GPU内存

时间:2019-04-15 05:10:46

标签: c cuda dynamic-memory-allocation

我用可以绘制简单金字塔的一定数量的像素实现了屏幕表示(通过为屏幕中的每个像素分配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值。 -实际结果:分段错误(核心已转储)。

0 个答案:

没有答案