我对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是正确的方法吗?如果是这样,我将非常感谢任何进一步的细节/指导或帮助我的教程。