Я просто бездельничаю, пытаясь немного узнать о параллельных вычислениях.Если есть что-то похожее на это,
long A[12];
long B[5,000,000];
long C[12];
long long total=0;
long long tmp;
GPUKernel(){
for (n=0; n < 5,000,000; ++n) {
B[n]=0;
}
for (n=0; n < 5,000,000; ++n) {
for (n2=0; n2 < 12; ++n2) {
B[n]+=C[A[n2]];
}
tmp+=B[n];
}
if (tmp > total) {
total=tmp;
tmp=0;
}
}
int main(){
srand( (unsigned)time( NULL ) );
for (n=0; n < 12; ++n) {
C[n]=rand() % 1000000;
}
for (n=0 ; n < 8916100448256 ; ++n) {
++A[0];
for (p=0; n<11; ++p) {
if (A[p]==12) {
A[p]=0;
++A[p+1];
}
}
GPUKernel();
}
return 0;
}
Моя идея в том, что я получу количество потоков, которые может использовать процессор.Например, если их 4, я сделаю отдельные копии всех данных о том, сколько раз я делаю столько потоков ЦП.Так что каждое ядро GPU будет иметь свои собственные данные.Имеет ли это смысл?Будет ли это хорошим способом выполнения этой задачи?
//cpu core 1
for (n=0; n < 8916100448256/4 ; ++n) {
...
GPUKernel1();
}
//cpu core 2
for (n=(8916100448256/4; n < (8916100448256/4)*2 ; ++n) {
...
GPUKernel2();
}
//cpu core 3
for (n=(8916100448256/4)*2; n < (8916100448256/4)*3 ; ++n) {
...
GPUKernel3();
}
//cpu core 4
for (n=(8916100448256/4)*3; n < 8916100448256) ; ++n) {
...
GPUKernel4();
}