4

我正在为 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 的计算能力很低,因此我无法访问一些更好的 CUDA 附加功能,这些附加功能允许更多的 C++ 使用。

4

4 回答 4

4

如果您知道表格的大小并希望将每个元素设置为某个值,您可以随时编写:

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

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

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

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

于 2012-06-21T09:20:01.867 回答
3

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

例如,如果您将数组设置为 4,则结果是每个 int 都使用 0x04040404 进行初始化(考虑 sizeof(int)=32),这取决于您的需要是否可以。

这适用于整数的初始化值的一些特定值。

但这导致几乎没有可移植的代码。

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

于 2013-03-11T09:59:53.407 回答
3

尽管我会添加一个选项并贡献几点:

  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 无符号)字节值(即介于0和之间0xFF)。

  3. 继续工具的答案-您可以执行的一些有用的 memset'ing 相当于使用(无符号)整数将数组设置为 0 或 to UINT_MAX,即 to0xFFFF0xFFFFFFFF等,具体取决于sizeof(unsigned).

  4. 如果我们有stridedmemset(),您可以应用这两个中的四个,将 4 字节整数设置为一个数组。然而,我们没有,事实上,目前看来这样做比仅仅循环没有任何优势。

于 2013-07-24T14:51:54.797 回答
2

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

于 2012-06-21T09:19:25.673 回答