当我们在CUDA中调用内核时是否会发生上下文切换?

时间:2017-04-19 23:19:06

标签: c++ cuda gpu

下面你可以看到奇数偶数排序代码。我的问题是在main()函数中,当我调用oddeven<< n / 2,1>> ()for for循环是否发生了上下文切换?他们可以更好地编写这种算法吗?

#include<stdio.h>
#include<cuda.h>
__global__ void oddeven(int* x,int I,int n){

int id=blockIdx.x;
if(I==0 && ((id*2+1)< n)){
    if(x[id*2]>x[id*2+1]){
        int X=x[id*2];
        x[id*2]=x[id*2+1];
        x[id*2+1]=X;
    }
}
if(I==1 && ((id*2+2)< n)){
    if(x[id*2+1]>x[id*2+2]){
        int X=x[id*2+1];
        x[id*2+1]=x[id*2+2];
        x[id*2+2]=X;
    }
}
}

int main()
{
int a[100],n,c[100],i;
int *d;

printf("Enter how many elements of first array:");
scanf("%d",&n);
printf("Enter No.\n");
for(i=0; i<n; i++)
{
    scanf("%d",&a[i]);
}

cudaMalloc((void**)&d, n*sizeof(int));

cudaMemcpy(d,a,n*sizeof(int),cudaMemcpyHostToDevice);


for(i=0;i<n;i++){

    //int size=n/2;

    oddeven<<<n/2,1>>>(d,i%2,n);
}
printf("\n");


cudaMemcpy(c,d,n*sizeof(int), cudaMemcpyDeviceToHost);
printf("Sorted Array is:\t");
for(i=0; i<n; i++)
{
    printf("%d\t",c[i]);
}

cudaFree(d);
return 0;
}

1 个答案:

答案 0 :(得分:-1)

根据您的解释性评论,忽略上下文切换的问题,而不是试图弄清楚您在那里做了什么:

将循环推入内核应该比多次启动更快,每次启动都会进行少量工作。