【问题标题】:Multithread Programming for memcpymemcpy 的多线程编程
【发布时间】:2013-03-10 14:11:26
【问题描述】:

我正在为 memcpy 函数做一个优化任务,我在这里找到了这个链接。 How to increase performance of memcpy

由于不熟悉多线程编程,不知道如何将下面的代码插入到原来的main函数中?如何将原问题中的代码修改成多线程memcpy项目?我的意思是,如何为这个多线程memcpy 项目创建一个完整的项目。原main函数中插入startCopyThreadsstopCopyThreadsmt_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;
}

【问题讨论】:

  • 你要去哪里?您是否希望通过使用多线程来提高memcpy() 的性能?
  • @NPE 是的,这就是我想要的。
  • 基本上你会从你的 main 函数中调用 mt_memcpy。就其价值而言,这不太可能真正提高 memcpy 的速度。信号量和线程的开销远远超过了大多数 memcpy 的开销。但是你应该在你的代码中使用它之前测量它。
  • 您所指的线程可以追溯到 2010 年,这是非常古老的 :) 如果没有深入了解您的体系结构(操作系统和处理器),不要期望更快地获得这些东西。通常这在现代系统上是相当优化的,很难超越它。无论如何,这取决于您的内存吞吐量,而不是处理时间。
  • 其他问题有一个非常特定的硬件配置:硬件细节:AMD Magny Cours- 4x octal core 128 GB DDR3 这可能会影响结果.在单独的内核上运行线程将获得一个单独的内存控制器在该硬件上,但不是在我们的普通桌面上。

标签: c++ c multithreading memcpy


【解决方案1】:

这在很大程度上取决于架构和操作系统。

只有一个处理器:

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

多核:

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

【讨论】:

  • 但是,如果您的处理器中有 SIMD 单元,使用这些说明肯定会有助于改进,并且您不需要使用线程。
  • 你知道如何修改我上面提到的链接中的代码以获得如下结果:1826 MB/sec 2 个线程:3118 MB/sec 3 个线程:4121 MB/sec。我的意思是,即使我不能得到相同的结果。我可以测试这种多线程方法是否适用于我的 i7 CPU。
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2013-04-21
  • 2011-12-27
相关资源
最近更新 更多