Sorting 按键排序比按键排序慢得多

Sorting 按键排序比按键排序慢得多,sorting,cuda,qsort,Sorting,Cuda,Qsort,我发现推力::按键排序比qsort慢得多,这让我感到并行排序的性能很低,为什么 数据集是100。 qsort时间为0.000026(s)。 GPU_排序时间为0.000912(s) 数据集是1000。 qsort时间为0.000205。 GPU_排序时间为0.003177 数据集是10000。 qsort时间为0.001598。 GPU_排序时间为0.031547 数据集是100000。 qsort时间为0.018564。 GPU_排序时间为0.31230 数据集为1000000。 qsort时

我发现推力::按键排序比qsort慢得多,这让我感到并行排序的性能很低,为什么

数据集是100。 qsort时间为0.000026(s)。 GPU_排序时间为0.000912(s)

数据集是1000。 qsort时间为0.000205。 GPU_排序时间为0.003177

数据集是10000。 qsort时间为0.001598。 GPU_排序时间为0.031547

数据集是100000。 qsort时间为0.018564。 GPU_排序时间为0.31230

数据集为1000000。 qsort时间为0.219892。 GPU_排序时间为3.138608

数据集是10000000。 qsort时间为2.581469。 GPU排序时间为85.456543

这是我的密码:

struct HashValue{
int id_;
float proj_;
 };

int HashValueQsortComp(const void* e1, const void* e2)                      

{

int ret = 0;

HashValue* value1 = (HashValue *) e1;

HashValue* value2 = (HashValue *) e2;

if (value1->proj_ < value2->proj_) {
    ret = -1;
} else if (value1->proj_ > value2->proj_) {
    ret = 1;
} else {
    if (value1->id_ < value2->id_) ret = -1;
    else if (value1->id_ > value2->id_) ret = 1;
}
return ret;
}


const int N = 10;

void sort_test()
{

clock_t start_time = (clock_t)-1.0;
clock_t end_Time = (clock_t)-1.0;

HashValue *hashValue = new HashValue[N];
srand((unsigned)time(NULL));

for(int i=0; i < N; i++)
{
    hashValue[i].id_ = i;
    hashValue[i].proj_ = rand()/(float)(RAND_MAX/1000);
}

start_time = clock();
qsort(hashValue, N, sizeof(HashValue), HashValueQsortComp);
end_Time = clock();
printf("The qsort time is %.6f\n", ((float)end_Time - start_time)/CLOCKS_PER_SEC);

float *keys = new float[N];
int *values = new int[N];
for(int i=0; i<N; i++)
{
    keys[i] = hashValue[i].proj_;
    values[i] = hashValue[i].id_;
}
start_time = clock();
thrust::sort_by_key(keys, keys+N, values);
end_Time = clock();
printf("The GPU_sort time is %.6f\n", ((float)end_Time - start_time)/CLOCKS_PER_SEC);

delete[] hashValue;
hashValue = NULL;

delete[] keys;
keys = NULL;

delete[] values;
values = NULL;
}
struct HashValue{
int-id_2;;
浮动项目;
};
int HashValueQsortComp(常量无效*e1,常量无效*e2)
{
int-ret=0;
HashValue*value1=(HashValue*)e1;
HashValue*value2=(HashValue*)e2;
如果(值1->项目<值2->项目){
ret=-1;
}否则如果(值1->项目>值2->项目){
ret=1;
}否则{
如果(value1->id\u2->id\u1)ret=-1;
否则,如果(value1->id\u>value2->id\u)ret=1;
}
返回ret;
}
常数int N=10;
无效排序测试()
{
时钟开始时间=(时钟)-1.0;
时钟结束时间=(时钟)-1.0;
HashValue*HashValue=新的HashValue[N];
srand((无符号)时间(NULL));
对于(int i=0;i
):

thrust::sort_by_key(keys, keys+N, values);
主机变量。这意味着该算法不在GPU上运行。请参阅以了解有关推力的更多信息,这是将推力与设备变量一起使用的示例


显然,主机调度的推力排序比您的
qsort
实现慢。如果您使用设备路径(并且只对推力排序操作计时),可能会更快。

设备是K40。我的cpu是1200.468 MHz,您真的知道推力排序没有在gpu上运行吗?