c++ - 我想将我的代码从 C++ 更改为 CUDA,知道吗?

标签 c++ sorting cuda

我有一个我无法解决的问题。

问题如下。

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

通过使用这段代码,我希望“数据”数组的元素被收集到超过阈值。(没有超过阈值的元素对我来说并不重要。重要的是刚刚超过阈值。)

我想要在 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变量的同步问题造成了这种情况。

但是,我不知道如何解决这个问题。

请帮助我的代码。提前谢谢你。

最佳答案

此代码已损坏:

    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);

如果在所有这些赋值过程中修改了 nCount,就会产生无意义的结果。应该是

    int d = atomicAdd(nCount, 1);
    data[d+0] = data[idx*10+0];
    data[d+1] = data[idx*10+1];
    data[d+2] = data[idx*10+2];
    data[d+3] = data[idx*10+3];
    data[d+4] = data[idx*10+4];
    data[d+5] = data[idx*10+5];
    data[d+6] = data[idx*10+6];
    data[d+7] = data[idx*10+7];
    data[d+8] = data[idx*10+8];
    data[d+9] = data[idx*10+9];

关于c++ - 我想将我的代码从 C++ 更改为 CUDA,知道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11534862/

相关文章:

python - 在 PyCuda 中实现一个新类

c++ - 如何在编译时从一些不同的类型中选择类型?

java 二维数组 - 排序和搜索

c++ - 如何使用区分大小写的元素对 std::list 进行排序?

Java:对数组列表进行排序并以二维数组形式返回

makefile - 在 makefile 错误中编译 cuda 文件

c++ - Poco HTTPClientSession 将 header 添加到 HTTPRequest

c++ - 如何删除QComboBox的所有内容

c++ - 大多数派生类如果未实现虚函数则无法编译,但如果一个基类未实现虚函数则可以编译

gcc - 我可以在 Windows7x64 (MSVC) 和 Linux64 (GCC4.8.2) 的 .cu 文件 (CUDA5.5) 中使用 C++11 吗?