【发布时间】:2015-06-17 08:01:34
【问题描述】:
我正在尝试用 cuda-c 语言实现奇偶排序程序。但是,每当我将 0 作为输入数组中的元素之一时,结果数组没有正确排序。但是,在其他情况下,它适用于其他输入。我不明白代码有什么问题.这是我的代码:
#include<stdio.h>
#include<cuda.h>
#define N 5
__global__ void sort(int *c,int *count)
{
int l;
if(*count%2==0)
l=*count/2;
else
l=(*count/2)+1;
for(int i=0;i<l;i++)
{
if(threadIdx.x%2==0) //even phase
{
if(c[threadIdx.x]>c[threadIdx.x+1])
{
int temp=c[threadIdx.x];
c[threadIdx.x]=c[threadIdx.x+1];
c[threadIdx.x+1]=temp;
}
__syncthreads();
}
else //odd phase
{
if(c[threadIdx.x]>c[threadIdx.x+1])
{
int temp=c[threadIdx.x];
c[threadIdx.x]=c[threadIdx.x+1];
c[threadIdx.x+1]=temp;
}
__syncthreads();
}
}//for
}
int main()
{int a[N],b[N],n;
printf("enter size of array");
scanf("%d",&n);
print("enter the elements of array");
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("ORIGINAL ARRAY : \n");
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
int *c,*count;
cudaMalloc((void**)&c,sizeof(int)*N);
cudaMalloc((void**)&count,sizeof(int));
cudaMemcpy(c,&a,sizeof(int)*N,cudaMemcpyHostToDevice);
cudaMemcpy(count,&n,sizeof(int),cudaMemcpyHostToDevice);
sort<<< 1,n >>>(c,count);
cudaMemcpy(&b,c,sizeof(int)*N,cudaMemcpyDeviceToHost);
printf("\nSORTED ARRAY : \n");
for(int i=1;i<=n;i++)
{
printf("%d ",b[i]);
}
}
【问题讨论】:
-
这应该是一种什么样的排序算法?
O(n)运行时如果它有效,将令人印象深刻,特别是对于比较排序。没有什么惊喜。 -
@EOF 我对此不作任何声明,除非似乎与here 所呈现的内容存在某种概念上的相似性。
-
@RobertCrovella:我知道你不是在为这个问题辩护,但关于比较排序的重要概念是它们最多是
O(nlogn),这需要你的链接中的两个嵌套循环。这个问题没有嵌套循环。 -
@EOF 缺少第二个/嵌套循环,因为它在固有的并行多线程架构 (CUDA) 上运行。 (并且受制于我在与线程块相关的答案中指出的限制。)我认为除了你之外没有人提到
O(n)。我提供的链接建议最坏的情况O(n^2)用于天真的奇偶排序。我没有看到任何人提出其他要求。