Tag: memcpy

提示编译器可以使用对齐的memcpy

我有一个由7个__m256值组成的结构,它在内存中以32字节对齐的方式存储。 typedef struct { __m256 xl,xh; __m256 yl,yh; __m256 zl,zh; __m256i co; } bloxset8_t; 我通过对动态分配的数据使用posix_memalign()函数或对静态分配的数据使用(aligned(32))属性来实现32字节对齐。 对齐很好,但是当我使用两个指向这样的结构的指针,并将它们作为memcpy()的目标和源传递时,编译器决定使用__memcpy_avx_unaligned()进行复制。 我怎样才能强制clang使用对齐的avx memcpy函数,我认为它是更快的变体? 操作系统:Ubuntu 16.04.3 LTS,Clang:3.8.0-2ubuntu4。 UPDATE 仅在复制两个或多个结构时才会调用__memcpy_avx_unaligned()。 当只复制一个时,clang会发出14个vmovup指令。

memcpy缓冲区和数组不工作

我有一个要求,我需要将一个空数组作为参数传递给一个函数。 在这个被调用的函数中,我应该将一些数据memcpy到传递的数组中。 所以我写了一个与我的要求相同的小例子。 下面是它的代码: #include #include void printArr(int *a) { int i; int *b=(int*)malloc(sizeof(int)*10); printf(“\n\nEnter 10 lements:\n”); for(i=0;i<10;i++) scanf("%d",&b[i]); printf("\nContents of array b:\n"); for(i=0;i<10;i++) printf("%d\t",b[i]); printf("\n"); memcpy(a,b,10); printf("\nContents of array a:\n"); for(i=0;i<10;i++) printf("%d\t",a[i]); printf("\n"); } int main() { int a[10]; printArr(a); return 0; } 在上面的例子中,我将一个数组从main函数发送到printArr函数。 现在在被调用的函数中,数据将被存储到数组中。 当打印数组内容时,我得到一些垃圾值。 此外,编译还会发出警告,如下所示: $ gcc -o arr array.c array.c: In […]

将每秒字节快速复制到新存储区

我需要一种快速的方法将每个第二个字节复制到一个新的malloc内存区域。 我有一个RGB数据和每通道16位(48位)的原始图像,并希望创建一个每通道8位(24位)的RGB图像。 有没有比按字节复制更快的方法? 我对SSE2了解不多,但我想SSE / SSE2是可能的。

是可以用比特而不是字节来做memcpy吗?

我想知道是否可以通过位而不是字节来进行memcpy ? 我正在为带有VLAN标记的以太网帧编写C代码,其中我需要填写VLAN标头属性(PCP-3bits,DEI-1bit,VID-12bits)的不同值。 如何对这些位执行memcpy,或者以位为单位向这些属性填充值的任何其他可能性。 提前致谢 !

有一个标准的,跨步的memcpy版本?

我有一个列向量A,长度为10个元素。 我有一个矩阵B,它是10乘10.B的内存存储是列专业。 我想用列向量A覆盖B中的第一行 。 显然,我可以这样做: for ( int i=0; i < 10; i++ ) { B[0 + 10 * i] = A[i]; } 我在0 + 10 * i留下了零,以突出显示B使用列主存储(零是行索引)。 在今晚CUDA-land的一些诡计之后,我想到可能有一个CPUfunction来执行一个跨步的memcpy? 我想在低级别,性能将取决于是否存在一个跨步加载/存储指令,我不记得在x86汇编中?

如何在c ++中连接两个结构类型变量?

我一直试图将一些struct(我定义的)类型变量连接成一个更大的变量。 我得到的基本上是这样的: 我有一个struct和两个struct **类型的变量。 我声明第三个结构C,我想将A和B连接成C.我尝试的是这样的(我现在没有代码在我面前所以我会写一些与某些名字非常相似的东西改变,因为我不记得他们。 struct** A, B; struct** C; (我知道A和B,因为我通过调用另一个函数接收它们) 我像这样为C分配内存。 C = (struct**)malloc(sizeof(A)+sizeof(B)); 我用这样的memcpy移动A和B. memcpy(&C, &A, sizeof(A)); memcpy(&C + sizeof(A), &C, sizeof(B)); 显而易见的是,我所做的并不正确,因为看起来所有这些C只包含A.我很确定问题来自“**”,我无法处理好指针的指针。 有人可以就我的问题给我一些建议吗? 我也不想使用Handles,我必须使用memcpy / memmove。 [评论更新:] 我的结构都是相同的类型。

memcpy的multithreading编程

我正在为memcpy函数做一个优化任务,我在这里找到了这个链接。 如何提高memcpy的性能 由于我不熟悉multithreading编程,我不知道如何将下面的代码插入到原始主函数中? 如何将原始问题中的代码修改为multithreadingmemcpy项目? 我的意思是,如何为这个multithreadingmemcpy项目创建一个完整的项目。 在原始main函数中插入函数(如startCopyThreads或stopCopyThreads或mt_memcpy函数)的位置在哪里? #define NUM_CPY_THREADS 4 HANDLE hCopyThreads[NUM_CPY_THREADS] = {0}; HANDLE hCopyStartSemaphores[NUM_CPY_THREADS] = {0}; HANDLE hCopyStopSemaphores[NUM_CPY_THREADS] = {0}; typedef struct { int ct; void * src, * dest; size_t size; } mt_cpy_t; mt_cpy_t mtParamters[NUM_CPY_THREADS] = {0}; DWORD WINAPI thread_copy_proc(LPVOID param) { mt_cpy_t * p = (mt_cpy_t * ) param; while(1) { WaitForSingleObject(hCopyStartSemaphores[p->ct], […]

对memcpy_s的未定义引用

我正在尝试修复对memcpy_s()错误的未定义引用。 我在我的文件中包含了string.h , memcpy()函数运行正常,我也尝试过包含memory.h 。 我在x64 Windows 7上并使用gcc 4.8.1进行编译。 #include #include #include void doMemCopy(char* buf, size_t buf_size, char* in, int chr) { memcpy_s(buf, buf_size, in, chr); } buf内存已在main函数中分配,该函数调用doMemCpy(buf, 64, in, bytes) 。 in是从标准输入读取的字符串 来自cmd终端的确切错误: 未定义引用“memcpy_s”collect2.exe:错误:ld返回1退出状态

‘memcpy’式函数支持各个位的偏移量?

我正在考虑解决这个问题,但它看起来是一项相当艰巨的任务。 如果我自己拿这个,我可能会用几种不同的方式写出并选择最好的,所以我想我会问这个问题,看看是否有一个好的图书馆已经解决了这个问题,或者是否有人有想法/建议。 void OffsetMemCpy(u8* pDest, u8* pSrc, u8 srcBitOffset, size size) { // Or something along these lines. srcBitOffset is 0-7, so the pSrc buffer // needs to be up to one byte longer than it would need to be in memcpy. // Maybe explicitly providing the end of the buffer is best. // Also […]

强制GCC执行memcpy运行时大小检查的循环非开关?

是否有任何可靠的方法强制GCC(或任何编译器)在循环外的memcpy()中memcpy()运行时大小检查(其中该大小不是编译时常量,但在该循环内是常量),专门针对每个循环相关的尺寸范围而不是反复检查其中的尺寸? 这是一个测试案例,从这里报告的性能回归中减少了一个开源库,该库旨在用于大数据集的高效内存分析。 (回归恰好是因为我的一个提交…) 原始代码在Cython中,但我已将其简化为纯C代理,如下所示: void take(double * out, double * in, int stride_out_0, int stride_out_1, int stride_in_0, int stride_in_1, int * indexer, int n, int k) { int i, idx, j, k_local; k_local = k; /* prevent aliasing */ for(i = 0; i < n; ++i) { idx = indexer[i]; for(j = 0; j < […]