将浮点数写入uint8_t*位置
Writing a float to a uint8_t* location
我有一个CUDA内核函数接受uint8_t*。我想写一个计算float到这个uint8_t*数组的特定位置(指针开始位置后12字节)。
正确的做法是什么?如果我假设:
uint8_t* ptr = address of a properly initialized and allocated memory segment
那么下面的命令会导致内核崩溃:
float some_float = ...
*((float *) (ptr+12)) = some_float
我知道这可能不是正确的做法,甚至可能是失礼的…但是也许有人可以给一些关于如何最好地做到这一点的建议。
谢谢!
如何写float值?
我已经在处理不同数据大小的多个对象的项目上工作了。我们希望将对象属性保存在链表中,但将数据存储在单个公共大缓冲区中。所以在这个缓冲区中,我们有一个8位有符号整数,后面跟着一个32位浮点数,后面跟着一个64位无符号整数,等等……显然,除了第一个元素外,没有其他元素对齐以节省空间。因此,当我们想写入一个值时,我们这样做:
// Write float value to any position in your big buffer
float fValueToWrite = 10;
memcpy(ptr + 12, &fValueToWrite, sizeof(fValueToWrite));
当我们想要读取值时,我们这样做:
// Read the float from any unalign position of your big buffer
float fReadValue = 0;
memcpy(&fReadValue, ptr + 12, sizeof(fReadValue));
技巧是使用memcpy,它不关心从非单词边界读取。
但是如果我们这样读:
float buffer[256] = {0};`
uint8_t* ptr = (uint8_t *)buffer;
float fCrashReadValue = *((float *)(ptr + 11));
可能导致处理器不支持读取可被11整除的边界(LoL实际上它是一个素数)的对齐错误。因此,如果你的CPU是32位,在这种情况下,12是一个有效的边界,只要ptr
指向已分配的缓冲区,而不是指向另一个可能没有正确对齐的指针。
根据经验,我可以告诉你,我使用过的许多ARM处理器在使用非边界地址时会出错。但是x86 (intel)处理器将悄悄地重新调整性能。
希望对你有帮助
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 从值小于256的uint16到uint8的Endian安全转换
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何将元素添加到向量的字符串位置
- 如何选择在 csv 文件中输出的位置
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- 如何在特定位置追加 json 文件
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置