【问题标题】:cudaMemset() - does it set bytes or integers?cudaMemset() - 它设置字节还是整数?
【发布时间】:2012-11-03 10:30:23
【问题描述】:

来自online 文档:

cudaError_t cudaMemset (void * devPtr, int value, size_t count )

用常量byte值填充devPtr指向的内存区域的第一个count字节。

参数: devPtr - 指向设备内存的指针 value - 为指定内存的每个 byte 设置的值 count - 要设置的 字节 大小

此描述似乎不正确:

int *dJunk;
cudaMalloc((void**)&dJunk, 32*(sizeof(int));
cudaMemset(dJunk, 0x12, 32);

会将所有 32 个整数设置为 0x12,而不是 0x12121212。 (整数与字节)

描述谈到设置字节。 Count 和 Value 以字节为单位进行描述。注意 count 是 size_t 类型,value 是 int 类型。即将字节大小设置为 int 值。

cudaMemset() 在 prog 指南中没有提到。 我必须假设我看到的行为是正确的,并且文档很糟糕。

那里有更好的文档来源吗? (在哪里?)
是否支持其他类型?即float *dJunk; 会工作吗?其他人?

【问题讨论】:

    标签: cuda semantics memset


    【解决方案1】:

    文档是正确的,而您对 cudaMemset 所做的解释是错误的。该函数确实设置了字节值。您的示例将前 32 个 字节 设置为 0x12,而不是将所有 32 个整数设置为 0x12,即:

    #include <cstdio>
    
    int main(void)
    {
        const int n = 32;
        const size_t sz = size_t(n) * sizeof(int);
        int *dJunk;
        cudaMalloc((void**)&dJunk, sz);
        cudaMemset(dJunk, 0, sz);
        cudaMemset(dJunk, 0x12, 32);
    
        int *Junk = new int[n];
    
        cudaMemcpy(Junk, dJunk, sz, cudaMemcpyDeviceToHost);
    
        for(int i=0; i<n; i++) {
            fprintf(stdout, "%d %x\n", i, Junk[i]);
        }
    
        cudaDeviceReset();
        return 0;
    }
    

    生产

    $ nvcc memset.cu 
    $ ./a.out 
    
    0 12121212
    1 12121212
    2 12121212
    3 12121212
    4 12121212
    5 12121212
    6 12121212
    7 12121212
    8 0
    9 0
    10 0
    11 0
    12 0
    13 0
    14 0
    15 0
    16 0
    17 0
    18 0
    19 0
    20 0
    21 0
    22 0
    23 0
    24 0
    25 0
    26 0
    27 0
    28 0
    29 0
    30 0
    31 0
    

    即。所有 128 个字节设置为 0,然后前 32 个字节设置为0x12。与文档中描述的完全一样。

    【讨论】:

    • 是的,我查看的结果不正确。尝试更改 cudaMemset(dJunk, 0x12, 32);到 cudaMemset(dJunk, 0x1234, 32);看来 cudaError_t cudaMemset (void * devPtr, int value, size_t count ) 应该是: cudaError_t cudaMemset (void * devPtr, char value, size_t count ) 即 VALUE 是大小字节。使用 size int 有点误导。 (只是指出这一点。)
    • @Doug:我仍然不确定你的意思是什么。您在问题中引用的文档清楚地表明 value 被视为字节值。该函数的行为与标准 C memset 相同,唯一的区别是字节值在 32 位字的 LSB 中传递。顺便说一句,如果您真正需要的话,驱动程序 API 中有一个真正的 32 位 memset 函数。
    • 如果数据类型是float,而不是int,则此方法不起作用。在这种情况下,Junk 始终是零数组。如何使其适用于浮点值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2011-11-26
    • 1970-01-01
    • 2013-09-01
    • 2011-09-01
    相关资源
    最近更新 更多