Tag: memcpy

复制跨步数据(往返于CUDA设备)的有效方法?

是否有可能有效地将由恒定(或甚至非常数)值跨越的数据复制到CUDA设备和从CUDA设备复制? 我想对角化一个大的对称矩阵。 使用jacobi算法,在每次迭代中使用两行和两列进行一系列操作。 由于Matrix本身太大而无法完全复制到设备,因此我正在寻找将两行和两列复制到设备的方法。 使用三角矩阵forms存储数据会很好,但还有其他缺点 非恒定行长[不是那种问题] 列值的非恒定步幅[每行的步幅增加1。] 出现。 [编辑:即使使用三角形,仍然无法将整个Matrix存储在GPU上。] 我查看了一些时间并认识到逐个复制跨步值非常慢(同步和异步)。 //编辑:删除解决方案 – 添加了答案

任何编译器都通过memcpy / memmove传输有效类型

根据N1570 6.5 / 6: 如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是复制值的对象的有效类型(如果有)。 这表明即使在“long”和其他整数类型具有相同表示的系统上,以下内容也会调用未定义的行为: #if ~0UL == ~0U #define long_equiv int #elif ~0UL == ~0ULL #define long_equiv long long #else #error Oops #endif long blah(void) { long l; long_equiv l2; long_equiv *p = malloc(sizeof (long)); l = 1234; memcpy(p, &l, sizeof (long)); l2 = *p; free(p); // Added to address complaint about leak […]

memcpy()和strncpy()有什么区别,因为后者很容易替代前者?

memcpy()和strncpy()之间有什么重大区别? 我问这个是因为我们可以轻松地改变strncpy()来复制我们想要的任何类型的数据,而不仅仅是字符,只需将前两个非char*参数转换为char*并将第三个参数更改为大小的倍数即可。非char类型。 在下面的程序中,我已成功使用它将整数数组的一部分复制到其他程序中,并且它与memcpy()一样好用。 #include #include int main () { int arr[2]={20,30},brr[2]={33,44}; //memcpy(arr,brr,sizeof(int)*1); strncpy((char*)arr,(char*)brr,sizeof(int)*1); printf(“%d,%d”,arr[0],arr[1]); } 同样,我们可以使它适用于float或其他数据类型。 那么与memcpy()的显着区别是什么? PS:另外,我想知道为什么memcpy()在string.h头文件中,因为几乎所有的库函数都与字符串相关,而memcpy()本质上更通用。 任何原因?

memcpy和copy之间的区别

Struct A { uint16_t len; uint8_t cnt; uint8_t unit; uint32_t seq; }; 此结构A被序列化为char * buf。 如果我想反序列化各个值,例如: uint16_t len = 0; memcpy(&len, buf, sizeof(len)); 或者我可以做 uint16_t len = (uint16_t) buf; 哪一个更好或者两者都相同? 如果我这样做的话,也要对整个结构进行反序列化 A tmp; memcpy(&tmp, buf, sizeof(A)); 这工作正常还是我应该担心编译器的填充等?

memcpy vs C中的赋值 – 应该是memmove吗?

正如在这个问题的答案中指出的那样,编译器(在这种情况下是gcc-4.1.2,是的,它是旧的,我不能改变它)可以用它认为合适的memcpy替换结构赋值。 我正在valgrind下运行一些代码,并收到有关memcpy源/目标重叠的警告。 当我查看代码时,我看到了这一点(释义): struct outer { struct inner i; // lots of other stuff }; struct inner { int x; // lots of other stuff }; void frob(struct inner* i, struct outer* o) { o->i = *i; } int main() { struct outer o; // assign a bunch of fields in o->i… frob(&o.i, o); return […]

C中最快的去交织操作?

我有一个指向mixed字节数组的指针,它包含两个不同数组array1和array2的交错字节。 mixed看起来像这样: a1b2c3d4… 我需要做的是解交织字节,所以我得到array1 = abcd…和array2 = 1234… 我知道提前mixed的长度,并且array1和array2的长度是等价的,都等于mixed / 2 。 这是我当前的实现(已分配array1和array2 ): int i, j; int mixedLength_2 = mixedLength / 2; for (i = 0, j = 0; i < mixedLength_2; i++, j += 2) { array1[i] = mixed[j]; array2[i] = mixed[j+1]; } 这避免了任何昂贵的乘法或除法运算,但仍然运行得不够快。 我希望有一些像memcpy这样的东西,它可以使用一个可以使用低级块复制操作的索引器来加速这个过程。 是否有比我现有的更快的实施? 编辑 目标平台是针对iOS和Mac的Objective-C。 对于iOS设备而言,快速操作更为重要,因此针对iOS的解决方案将比没有更好。 更新 感谢大家的回应,尤其是Stephen Canon,Graham Lee和Mecki。 […]

快速ARM NEON memcpy

我想在ARMv7核心上复制图像。 天真的实现是每行调用memcpy。 for(i = 0; i < h; i++) { memcpy(d, s, w); s += sp; d += dp; } 我知道以下内容 d, dp, s, sp, w 都是32字节对齐,所以我的下一个(仍然非常天真)实现是沿着的 for (int i = 0; i < h; i++) { uint8_t* dst = d; const uint8_t* src = s; int remaining = w; asm volatile ( "1: \n" […]

C:动态分配数组的memcpy速度

我需要有关以下代码性能的帮助。 它对两个任意大小的动态分配数组执行memcpy: int main() { double *a, *b; unsigned n = 10000000, i; a = malloc(n*sizeof(double)); b = malloc(n*sizeof(double)); for(i=0; i<n; i++) { a[i] = 1.0; /* b[i] = 0.0; */ } tic(); bzero(b, n*sizeof(double)); toc("bzero1"); tic(); bzero(b, n*sizeof(double)); toc("bzero2"); tic(); memcpy(b, a, n*sizeof(double)); toc("memcpy"); } tic / toc测量执行时间。 在我的电脑上,memcpy需要0.035秒(Linux,gcc版本4.4.6)。 如果我现在取消注释初始化目标数组b的行,则代码快三倍(!) – 0.011s。 我在使用循环而不是memcpy时观察到类似的行为。 通常我不关心这个,因为它足以在使用之前“初始化”内存。 […]

Memcpy实现,严格别名

在学习c的同时,我实现了自己的memcpyfunction。 我在函数中使用了更宽泛的类型( uint32_t )。 (为简单起见,该函数仅限于4的倍数且数据正确对齐的类型) void memcpy4( void* dst , void* src , int size ) { size /= 4; for ( int i = 0 ; i < size ; i++ ) ((uint32_t*)dst)[i] = ((uint32_t*)src)[i]; } 我做了关于类型惩罚和严格别名的阅读,我相信上面的function打破了规则。 正确的实现是这样的,因为你可以使用char: void memcpy4( void* dst , void* src , int size ) { for ( int i […]

复制内存时出现问题

所以我有一个问题,我连续两个晚上连续爆炸: (tuple1和tuple2是传递给此函数的void指针) char *data; data = (char*) calloc (76, 1); memcpy(data, tuple1, 32); memcpy(data+32, tuple2, 44); 想法是分配内存等于tuple1和tuple2的大小之和( tuple1是32个字节, tuple2是44)然后复制32个字节的tuple1并将它们粘贴到数据的地址,然后复制44个字节tuple2并将它们粘贴到数据地址后的32个字节。 问题是,如果我只复制tuple1或只复制tuple2它真的被复制到应该的位置(我打印的数据太长了,放在这里的function),但当我做两个内存复制时,第一个memcpy()工作很好,但第二个没有。 有谁可以帮我解决这个严重的问题?