C++ memcpy的多线程编程

C++ memcpy的多线程编程,c++,c,multithreading,memcpy,C++,C,Multithreading,Memcpy,我正在为memcpy函数做一个优化任务,我在这里找到了这个链接 由于我不熟悉多线程编程,我不知道如何将下面的代码插入到原始的主函数中?如何将原始问题中的代码修改为多线程memcpy项目?我的意思是,如何为这个多线程memcpy项目创建一个完整的项目。在原始主函数中插入函数如startCopyThreads或stopCopyThreads或mt_memcpy的位置在哪里 #define NUM_CPY_THREADS 4 HANDLE hCopyThreads[NUM_CPY_THREADS]

我正在为memcpy函数做一个优化任务,我在这里找到了这个链接

由于我不熟悉多线程编程,我不知道如何将下面的代码插入到原始的主函数中?如何将原始问题中的代码修改为多线程memcpy项目?我的意思是,如何为这个多线程
memcpy
项目创建一个完整的项目。在原始主函数中插入函数如
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], INFINITE);
        memcpy(p->dest, p->src, p->size);
        ReleaseSemaphore(hCopyStopSemaphores[p->ct], 1, NULL);
    }

    return 0;
}

int startCopyThreads()
{
    for(int ctr = 0; ctr < NUM_CPY_THREADS; ctr++)
    {
        hCopyStartSemaphores[ctr] = CreateSemaphore(NULL, 0, 1, NULL);
        hCopyStopSemaphores[ctr] = CreateSemaphore(NULL, 0, 1, NULL);
        mtParamters[ctr].ct = ctr;
        hCopyThreads[ctr] = CreateThread(0, 0, thread_copy_proc, &mtParamters[ctr], 0,     NULL); 
}

    return 0;
}

void * mt_memcpy(void * dest, void * src, size_t bytes)
{
    //set up parameters
    for(int ctr = 0; ctr < NUM_CPY_THREADS; ctr++)
    {
        mtParamters[ctr].dest = (char *) dest + ctr * bytes / NUM_CPY_THREADS;
        mtParamters[ctr].src = (char *) src + ctr * bytes / NUM_CPY_THREADS;
        mtParamters[ctr].size = (ctr + 1) * bytes / NUM_CPY_THREADS - ctr * bytes /     NUM_CPY_THREADS;
    }

    //release semaphores to start computation
    for(int ctr = 0; ctr < NUM_CPY_THREADS; ctr++)
        ReleaseSemaphore(hCopyStartSemaphores[ctr], 1, NULL);

    //wait for all threads to finish
    WaitForMultipleObjects(NUM_CPY_THREADS, hCopyStopSemaphores, TRUE, INFINITE);

    return dest;
}

int stopCopyThreads()
{
    for(int ctr = 0; ctr < NUM_CPY_THREADS; ctr++)
    {
        TerminateThread(hCopyThreads[ctr], 0);
        CloseHandle(hCopyStartSemaphores[ctr]);
        CloseHandle(hCopyStopSemaphores[ctr]);
    }
    return 0;
}
#定义NUM_CPY_线程4
句柄hCopyThreads[NUM_CPY_THREADS]={0};
句柄hCopyStartSemaphores[NUM_CPY_THREADS]={0};
HANDLE hCopyStopSemaphores[NUM_CPY_THREADS]={0};
类型定义结构
{
int-ct;
void*src,*dest;
大小;
}麦德龙;
mt_cpy_t mtparameters[NUM_cpy_THREADS]={0};
DWORD WINAPI线程复制过程(LPVOID参数)
{
mt_cpy_t*p=(mt_cpy_t*)参数;
而(1)
{
WaitForSingleObject(hCopyStartSemaphores[p->ct],无限);
memcpy(p->dest,p->src,p->size);
释放信号量(hCopyStopSemaphores[p->ct],1,NULL);
}
返回0;
}
int startCopyThreads()
{
对于(int ctr=0;ctr
这在很大程度上取决于体系结构和操作系统

使用一个处理器:

如果您在只有1个内核的机器上为
memcpy
使用线程,则不会显示加速。原因是,对于在一个处理器上运行的所有线程,将存在上下文切换,这与不使用线程而使用memcpy相比是一个开销

使用多核:


在这种情况下,它还取决于内核,不管它是否将线程映射到不同的处理器上,因为这些线程将是用户级的。如果您的线程在不同的处理器上同时运行,那么如果内存具有双端口访问,您可能会看到加速。对于单端口接入,我不确定它是否会有所改进

你拿着这个去哪?您是否希望通过使用多线程来提高
memcpy()
的性能?@NPE是的,这就是我想要的。基本上,您可以从主函数调用mt_memcpy。无论如何,这不太可能真正提高memcpy的速度。信号量和线程的开销远远超过了大多数memcpy的成本。但在代码中使用它之前,您应该对它进行测量。您所指的线程是2010年的,这是非常古老的:)如果不深入了解您的体系结构(操作系统和处理器),不要期望更快地实现这些功能。通常,这在现代系统上是非常优化的,很难克服。在任何情况下,这取决于内存吞吐量,而不是处理时间。其他问题有一个非常具体的硬件配置:硬件详细信息:AMD Magny Cours-4x八进制128 GB DDR3,这可能会影响结果。在单独的内核上运行线程将在该硬件上获得单独的内存控制器,但在我们的普通台式机上则不然。但是,如果处理器中有SIMD单元,使用这些说明肯定会有助于改进,您不需要使用线程。您知道如何修改我上面提到的链接中的代码,以获得类似于:1826 MB/秒2线程:3118 MB/秒3线程:4121 MB/秒的结果吗。?我的意思是,即使我也不能得到同样的结果。我可以测试这个多线程方法是否在我的i7cpu中工作。