Исходя из 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 указывает на пространство общей памяти (я полагаю).Из того, с чем я столкнулся в документации чтение из нескольких потоков - это нормально.В CUDA чтения должны быть объединены - есть ли подобные ограничения выравнивания в pthreads?Т.е. если у меня есть два потока, читающие с одного и того же общего адреса, я предполагаю, что где-то вдоль линии планировщик должен поставить один поток впереди другого.В CUDA это может быть дорогостоящей операцией, и ее следует избегать.Существует ли штраф за «одновременное» чтение из общей памяти - и если да, то настолько ли он мал, что он незначителен?то есть обоим потокам может потребоваться одновременно прочитать d-> datPtr [0] - я предполагаю, что чтение из памяти не может происходить одновременно - это предположение неверно?* в котором говорится, что при многопоточности используется структура массивов - это согласуется с cuda.Однако, если я сделаю это, это почти неизбежно, мне понадобится идентификатор потока - который, я считаю, потребует от меня блокировки блокировки мьютекса идентификатором потока, пока он не будет считан в область потока, будет ли это так или будет другойопределить потоки?
Также приветствуется статья об управлении памятью для многопоточных программ.