2017-04-13 4 views
-2

私はthrust :: sort_by_keyがqsortよりもはるかに低速であることを発見しました。並列ソーティングのパフォーマンスが低いのはなぜですか?thrust :: sort_by_keyはqsortよりもはるかに遅い

データセットは100です。 qsort時間は0.000026(s)です。 GPU_sort時間は0.000912(s)です。

データセットは1000です。 qsort時間は0.000205です。 GPU_sort時間は0.003177です。

データセットは10000です。 qsort時間は0.001598です。 GPU_sort時間は0.031547です。

データセットは100000です。 qsort時間は0.018564です。 GPU_sort時間は0.31230です。

データセットは1000000です。 qsort時間は0.219892です。 GPU_sort時間は3.138608です。

データセットは10000000です。 qsort時間は2.581469です。 GPU_sort時間は85.456543です。ここ

私のコードです:あなたはスラストソートに渡している変数(keysvalues

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; 
} 
+0

デバイスはK40です。そして、私のCPUは1200.468 MHzのGenuineIntel – user2431522

+3

ですが、推力ソートはGPUで実行されていないことを理解していますか? – talonmies

答えて

1

thrust::sort_by_key(keys, keys+N, values); 

ホスト変数です。つまり、GPUで動作しないアルゴリズムの場合はthrust will dispatch the host pathです。推力の詳細についてはthrust quickstart guideを参照してください。hereは、推力をデバイス変数とともに使用した実例です。

ホストのディスパッチされたスラストソートは、qsortの実装よりも遅いです。デバイスのパスを使用して(スラストソートの操作にのみ時間がかかる)、時間がかかることがあります。

+0

あなたの答えをありがとう – user2431522

関連する問題