【问题标题】:memset in cuda that allows to set values within kernelcuda 中的 memset 允许在内核中设置值
【发布时间】:2011-12-12 09:47:31
【问题描述】:

我正在进行几次 cudamemset 调用,以便将我的值设置为 0,如下所示:

void allocateByte( char **gStoreR,const int byte){

    char **cStoreR = (char **)malloc(N * sizeof(char*));

    for( int i =0 ; i< N ; i++){
        char *c;
        cudaMalloc((void**)&c, byte*sizeof(char));

        cudaMemset(c,0,byte);
        cStoreR[i] = c;
    }
    cudaMemcpy(gStoreR, cStoreR, N * sizeof(char *), cudaMemcpyHostToDevice);
}

但是,事实证明这非常缓慢。 GPU上是否有memset函数,因为从CPU调用它需要很多时间。另外,cudaMalloc((void**)&c, byte*sizeof(char)) 是否会自动将 c 指向的位设置为 0。

【问题讨论】:

    标签: cuda parallel-processing nvidia


    【解决方案1】:

    每个cudaMemset 调用都会启动一个内核,因此如果N 很大而byte 很小,那么您将有很多内核启动开销来减慢代码速度。没有设备端memset,因此解决方案是编写一个内核,在一次启动中遍历分配并将存储归零。

    顺便说一句,我强烈建议不要在 CUDA 中使用数组结构。使用单个大块线性内存并索引到该内存来管理实现相同结果的速度要慢得多,而且要复杂得多。在您的示例中,它将代码减少为单个 cudaMalloc 调用和单个 cudaMemset 调用。在设备方面,缓慢的指针间接被一些非常快的整数运算所取代。如果您在主机上的源材料是一组结构,我建议您使用出色的thrust::zip_iterator 之类的东西来将数据转换为设备上的 GPU 友好形式。

    【讨论】:

    • cudaMalloc 是否自动将分配的位设置为 0。另外,我提供了询问算术编码问题的原因。请去看看。
    • 没有。该行为与标准 C malloc 相同。如果您想在使用前保证分配内存的内容,则必须将其显式初始化为所需的值。
    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2016-10-29
    • 2013-08-08
    相关资源
    最近更新 更多