【发布时间】:2011-06-07 15:19:09
【问题描述】:
来自 CUDA,我对如何从线程读取共享内存感兴趣,并与 CUDA 的读取对齐要求进行比较。我将使用以下代码作为示例:
#include <sys/unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#define THREADS 2
void * threadFun(void * args);
typedef struct {
float * dataPtr;
int tIdx,
dSize;
} t_data;
int main(int argc, char * argv[])
{
int i,
sizeData=5;
void * status;
float *data;
t_data * d;
pthread_t * threads;
pthread_attr_t attr;
data=(float *) malloc(sizeof(float) * sizeData );
threads=(pthread_t *)malloc(sizeof(pthread_t)*THREADS);
d = (t_data *) malloc (sizeof(t_data)*THREADS);
data[0]=0.0;
data[1]=0.1;
data[2]=0.2;
data[3]=0.3;
data[4]=0.4;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for (i=0; i<THREADS;i++)
{
d[i].tIdx=i;
d[i].dataPtr=data;
d[i].dSize=sizeData;
pthread_create(&threads[i],NULL,threadFun,(void *)(d+i));
}
for (i=0; i<THREADS; i++)
{
pthread_join(threads[i],&status);
if(status);
//Error;
}
return 0;
}
void * threadFun(void * args)
{
int i;
t_data * d= (t_data *) args;
float sumVal=0.0;
for (i=0; i<d->dSize; i++)
sumVal+=d->dataPtr[i]*(d->tIdx+1);
printf("Thread %d calculated the value as %-11.11f\n",d->tIdx,sumVal);
return(NULL);
}
在threadFun中,整个指针d都指向共享内存空间(我相信)。从我在文档中遇到的情况来看,reading from multiple threads 是可以的。在 CUDA 中需要合并读取 - pthread 中是否有类似的对齐限制? IE。如果我有两个线程从同一个共享地址读取,我假设调度程序必须将一个线程放在另一个线程之前。在 CUDA 中,这可能是一项昂贵的操作,应该避免。从共享内存中“同时”读取是否会受到惩罚 - 如果是这样,它是否太小以至于可以忽略不计?即两个线程可能需要同时读取 d->datPtr[0] - 我假设内存读取不能同时发生 - 这个假设是错误的吗?
我还阅读了article from intel,它说在多线程时使用数组结构 - 这与 cuda 一致。如果我这样做,几乎不可避免的是我将需要线程 ID - 我相信这将需要我使用互斥锁锁定线程 ID,直到它被读入线程的范围,这是真的还是会有其他方式识别线程?
一篇关于多线程程序的内存管理的文章也将不胜感激。
【问题讨论】: