使用memset和int值初始化整数数组 - 失败

时间:2012-06-21 09:10:37

标签: c cuda initialization fill memset

我正在为CUDA程序编写主机代码,因此我无法使用标准C函数。我在使用memset函数初始化整数数组的元素时遇到问题。我的印象是你可以使用memset来初始化一个整数数组,例如,像这样的所有4个:

int num_elements = 10;
int* array_example = (int*)malloc(num_elements * sizeof(int));
memset(array_example, 4, sizeof(array_example));

但是当我这样做时,它会将每个字节而不是每个int设置为4.如果我说:

memset(array_example, 4, 1);

我在第一个整数中得到4,如果我说:

memset(array_example, 4, 2);

我在第一个整数中得到1024,在第二个整数中得到0。我理解memset函数将第三个参数中指定的字节数设置为4,但有没有办法使用memset将每个整数设置为4而不是每个字节?否则,我是否坚持使用for循环?我的GPU具有较低的计算能力,因此我无法访问允许更多C ++使用的一些更好的CUDA添加。

4 个答案:

答案 0 :(得分:4)

如果你知道一个表的大小并想要将每个元素设置为某个值,你总是可以写:

int array[10] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 };

如果您使用gcc,您也可以这样做:

int array[10] = {[0 ... 9] = 4};

当你必须动态分配数组时,我怀疑是否有任何替代解决方案,只需使用一个简单的循环。

答案 1 :(得分:2)

memset没有标准的替代方法可以写入整数。你必须写一个循环。

答案 2 :(得分:2)

如果表示int值的位具有每字节字节常量的模式,考虑到int本身的表示(例如2-complement),则可以成功使用memset(不是幸运的问题)。

,例如,如果你用4记忆数组,事实证明每个int都用0x04040404初始化(考虑到sizeof(int)= 32),这可能是好的或不是取决于你的需要。

这适用于整数初始化值的许多特定值。

但这导致几乎无法移植的代码。

如果要将每个int初始化为零,它应该始终有效。

答案 3 :(得分:2)

虽然我会添加一个选项并提供一些观点:

  1. 如果您使用的是C ++而不是C,请尝试使用std::fill(),这是通用的 - 让编译器担心优化:

    std::fill_n(my_array, array_length, constant_value);
    
  2. memset()的签名是:

    void *memset(void *s, int c, size_t n);
    

    虽然它需要int,但它实际上需要一个(n无符号)字节值(即00xFF之间)。

  3. 继续tool's answer - 你可以做的一些有用的memset,相当于使用(无符号)整数将数组设置为0或UINT_MAX,即0xFFFF0xFFFFFFFF等,具体取决于sizeof(unsigned)

  4. 如果我们有strided memset(),您可以将这两个4字节整数中的四个应用于数组。但是,我们没有,事实上似乎目前没有优势,只是循环。