2012-03-15 5 views
0

を使用して予想される結果を提供しません.pがGPU側に割り当てられたポインタである場合、次のコードを考慮してください。推力は、推力:: minimum

thrust::device_ptr<float> pWrapper(p); 
thrust::device_ptr<float> fDevPos = thrust::min_element(pWrapper, pWrapper + MAXX * MAXY, thrust::minimum<float>()); 
fRes = *fDevPos; 
*fDicVal = fRes; 

CPU側で同じことを適用した後。

float *hVec = new float[MAXX * MAXY]; 
    cudaMemcpy(hVec, p, MAXX*MAXY*sizeof(float), cudaMemcpyDeviceToHost); 

    float min = 999; 
    int index = -1; 
    for(int i = 0 ; i < MAXX* MAXY; i++) 
    { 
     if(min > hVec[i]) 
     { 
      min = hVec[i]; 
      index = i; 
     } 
    } 
    printf("index :%d a wrapper : %f, as vectorDevice : %f\n",index, fRes, min); 
     delete hVec; 

私はその分!= fResを得る。私はここで間違って何をしていますか?

答えて

2

thrust::minimum_elementは、比較述語をユーザーに提供する必要があります。つまり、「はい」または「いいえ」の質問に「はyより小さい」と答えた関数ですか?

thrust::minimumは述語ではありません。 「xまたはyのどちらが小さいのですか?」という質問に答えます。

minimum_elementを使用して最小の要素を見つけるには、 thrust::less述語を渡す:

ptr_to_smallest_value = thrust::min_element(first, last, thrust::less<T>()); 

また、何も渡しません。 thrust::lessがデフォルトです:

ptr_to_smallest_value = thrust::min_element(first, last); 

あなたが興味を持っているすべて最小要素(最小の要素を指していないイテレータ)のであれば、あなたはthrust::reducethrust::minimumを組み合わせることができます

smallest_value = thrust::reduce(first, last, std::numeric_limits<T>::max(), thrust::minimum<T>()); 
+0

どのように高速ですか?私は昨晩あなたが私に書いた方法を使って、ポインタ(device_ptr)を返しました。その上で値を抽出するために*演算子を使用しなければなりませんでした。 –

+0

アレイの読み込み帯域幅によって制限される速度とほぼ同じ速度でなければなりません。 –

関連する問題