2

解決できない問題があります。

問題は次のとおりです。

CPP コード

const int dataSize = 65535;
const int category = 10;
float data[dataSize][category];
const float threshold = 0.5f;

int cnt = 0;

// data array contains any values

for(int i=0;i<dataSize;i++)
{
    if( data[i][9] > threshold )
    {
        data[cnt][0] = data[i][0];
        data[cnt][1] = data[i][1];
        data[cnt][2] = data[i][2];
        data[cnt][3] = data[i][3];
        data[cnt][4] = data[i][4];
        data[cnt][5] = data[i][5];
        data[cnt][6] = data[i][6];
        data[cnt][7] = data[i][7];
        data[cnt][8] = data[i][8];
        data[cnt][9] = data[i][9];
        cnt++;
    }
}

このコードを使用することで、data 配列の要素がしきい値を超えて収集されることを期待します (しきい値を超えていない要素は重要ではありません。重要なのは、しきい値を超えているだけです)。

CUDAでも同じ結果で動作するコードが欲しいです。

ということで、こんなことをしてみました。

CUDA コード

__global__ void checkOverThreshold(float *data, float threshold, int *nCount)
{
    int idx = threadIdx.x + blockIdx.x * blockDim.x;

    if( data[idx*10+9] > threshold )
    {
        data[nCount+0] = data[idx*10+0];
        data[nCount+1] = data[idx*10+1];
        data[nCount+2] = data[idx*10+2];
        data[nCount+3] = data[idx*10+3];
        data[nCount+4] = data[idx*10+4];
        data[nCount+5] = data[idx*10+5];
        data[nCount+6] = data[idx*10+6];
        data[nCount+7] = data[idx*10+7];
        data[nCount+8] = data[idx*10+8];
        data[nCount+9] = data[idx*10+9];
        atomicAdd( nCount, 1);
    }
}

....

// kernel function call
checkOverThreshold<<< dataSize / 128, 128 >>>(d_data, treshold, d_count);

しかし、CUDA コードの結果は、私が期待したものではありません。

それには多くのゴミの価値が含まれており、結果でさえCPPのものと同じではありません.

nCount 変数の同期の問題がこの状況を引き起こしていると思います。

しかし、私はこの問題を解決する考えがありません。

私のコードを助けてください。前もって感謝します。

4

3 に答える 3

1

SchighSchaghが示唆しているように、推力は1つの方法です。ArrayFireは、何が起こっているかをより数学的に表現します。

const int dataSize = 65535;
const int category = 10;
float data[dataSize][category];
const float threshold = 0.5f;

int cnt = 0;

// populate data

// Transfer to device
array Data(data, category, dataSize); // Column major
array idx = where(Data(9, span) > threshold);
Data = Data(span, idx);
于 2012-07-18T19:20:55.267 に答える