我正在为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添加。
答案 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)
,例如,如果你用4记忆数组,事实证明每个int都用0x04040404初始化(考虑到sizeof(int)= 32),这可能是好的或不是取决于你的需要。
这适用于整数初始化值的许多特定值。
但这导致几乎无法移植的代码。
如果要将每个int初始化为零,它应该始终有效。
答案 3 :(得分:2)
虽然我会添加一个选项并提供一些观点:
如果您使用的是C ++而不是C,请尝试使用std::fill()
,这是通用的 - 让编译器担心优化:
std::fill_n(my_array, array_length, constant_value);
memset()
的签名是:
void *memset(void *s, int c, size_t n);
虽然它需要int
,但它实际上需要一个(n无符号)字节值(即0
和0xFF
之间)。
继续tool's answer - 你可以做的一些有用的memset,相当于使用(无符号)整数将数组设置为0或UINT_MAX
,即0xFFFF
或0xFFFFFFFF
等,具体取决于sizeof(unsigned)
。
如果我们有strided memset()
,您可以将这两个4字节整数中的四个应用于数组。但是,我们没有,事实上似乎目前没有优势,只是循环。