【问题标题】:Initializing an integer array using memset and an int value - fails使用 memset 和 int 值初始化整数数组 - 失败
【发布时间】:2012-06-21 09:10:36
【问题描述】:

我正在为 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));

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

memset(array_example, 4, 1);

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

memset(array_example, 4, 2);

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

【问题讨论】:

    标签: c cuda initialization fill memset


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案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'ing 相当于使用(无符号)整数将数组设置为 0 或 UINT_MAX,即设置为 0xFFFF0xFFFFFFFF 等,具体取决于 @ 987654334@.

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

      【讨论】:

        【解决方案3】:
        如果考虑到 int 本身的表示(例如 2-补码),表示 int 值的位具有逐字节常量的模式,则可以成功使用 memset(不是幸运问题)。

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

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

        但这导致代码几乎不能移植。

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

        【讨论】:

          【解决方案4】:

          没有写入整数的标准替代 memset。您必须编写一个循环。

          【讨论】:

          • 好的,谢谢。我继承了一个超过 5000 行的程序来进行医学成像研究,他们到处使用memset,就好像它可以初始化每个整数一样。他们的代码有效,所以我试图弄清楚我是否遗漏了什么,或者他们幸运地重写了垃圾初始化。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-05
          • 2011-03-24
          • 1970-01-01
          • 2014-08-04
          • 2012-11-10
          相关资源
          最近更新 更多