2013-03-21 46 views
2

我正在做memcpy函数的优化任务,我在这里找到了这个链接。 How to increase performance of memcpymemcpy的多线程编程

由于我不熟悉多线程编程,我不知道如何将代码插入到原始主函数中?如何将原始问题中的代码修改为多线程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; 
} 
+0

你要去哪里?你是否希望通过使用多线程来提高'memcpy()'的性能? – NPE 2013-03-21 07:05:38

+0

@NPE是的,这就是我想要的。 – zjluoxiao 2013-03-21 07:07:36

+2

基本上你会从你的主函数调用mt_memcpy。对于它的价值,这不太可能实际上提高memcpy的速度。信号量和线程的开销远远超过了大部分memcpy的开销。但是在你的代码中使用它之前,你应该测量它。 – 2013-03-21 07:15:05

回答

0

这取决于体系结构和操作系统。

使用一个处理器:

如果你正在使用线程memcpy的机器上只有1个核心,则不会出现加速。原因是,对于在一个处理器上运行的所有线程,都会出现上下文切换,与使用memcpy而不使用线程的情况相比,这将是开销。

多核:

在这种情况下,它也取决于内核,无论是绘制在不同处理器上的线程或没有这些线程将用户级别。如果你的线程在同时运行的不同处理器上,如果内存有双端口访问,你可能会看到加速。对于单端口访问,我不确定它是否会有改进。

+0

但是,如果您的处理器中有SIMD单元,则使用这些指令肯定有助于改进,而且您不需要使用线程。 – Plasma 2013-03-21 11:08:35

+0

您是否知道如何修改上述链接中的代码来获得像这样的结果:1826 MB/sec 2线程:3118 MB /秒3线程:4121 MB /秒。我的意思是,即使我得不到相同的结果。我可以测试这个多线程方法是否适用于我的i7 CPU。 – zjluoxiao 2013-03-21 14:50:08