CUDA中cpu和gpu之间的任务分离

时间:2014-08-01 23:16:23

标签: gpu

我对CUDA编程很陌生,需要帮助才能继续。

现在我正在开发CUDA项目,我需要在CPU和GPU之间拆分应用程序并测量性能。 例如,对于数组大小为1000的 Matrix添加程序,我想将数组拆分为一半并将前半部分(500个作业)分配给CPU,将剩余的一半(500个作业)分配给它GPU并结合最终输出。我不太清楚如何去做。 我在另一个link中看到他们建议使用线程池和队列。我开始使用pthreads来做同样的事情,但是当谈到GPU部分代码时,我无法如何使用它们,因为我必须调用内核。我实际创建了两个pthreads,一个假设为CPU,另一个假设为GPU

for (int i=0;i < NUMTHRDS; i++) {
    pthread_create(&thds[i], &attr, decideFunc, (void*)i);
}

和determineFunc如下。当我执行时,我的pthread有时会两次进入CPU模式。我想在CPU中执行前半部分,在GPU中执行后半部分并适当地进行组合。 我怎么能这样做?

void* decideFunc(void *arg) {

    int id,first,last;
    id = (long)arg;
    first = id * TBSIZE/NUMTHRDS;
    last = (id + 1) * TBSIZE/NUMTHRDS;
    printf("id:%d\n\n",id);
    if(id == 0){
            printf("In CPU thread");
            matrixAddCPU(first, last); //**Can i invoke another function here ?**
            print_result(P, first, last); //P is array to store my result
    }else{
            printf("In GPU thread");
            matrixAddGPU(first, last); //This dint seem to be correct
    }
    pthread_exit((void*)0);
}

和我的matrixAddCPU()

void matrixAddCPU(int f, int l) {
    printf("\nInvoked f:%d l:%d\n",f,l);
    int row,col;
    for(row=f;row<l;row++) {
        for(col=f;col<l;col++) {
            P[row*WIDTH+col] = N[row*WIDTH+col] + M[row*WIDTH+col];
            printf("P[%d*%d+%d]:%f\t",row,WIDTH,col,P[row*WIDTH+col]);
        }
    printf("\n");
    }
}

我找不到任何进行此类操作的教程。我不想使用CUDA流,因为我不打算创建多个内核。我想要的是在CPU和GPU之间分离简单的应用程序,并在分析器工具中观察它们的性能。 使用pthreads是正确的方法吗?如果是这样,我将非常感谢任何进一步的细节/指导或帮助我的教程。

0 个答案:

没有答案