Jestem nowicjuszem w OpenCL. Rozumiem jednak podstawy C/C++ i OOP. Moje pytanie brzmi następująco: czy w jakiś sposób można równolegle uruchomić zadanie obliczania sumy? Czy to teoretycznie możliwe? Poniżej opiszę co próbowałem zrobić:Czy jest możliwe równoległe obliczanie sumy w OpenCL?
Zadanie jest, na przykład:
double* values = new double[1000]; //let's pretend it has some random values inside
double sum = 0.0;
for(int i = 0; i < 1000; i++) {
sum += values[i];
}
Co próbowałem zrobić w kernelu OpenCL (i czuję, że jest źle, ponieważ może to uzyskuje dostęp do ta sama zmienna "suma" z różnych wątków/zadań w tym samym czasie):
__kernel void calculate2dim(__global float* vectors1dim,
__global float output,
const unsigned int count) {
int i = get_global_id(0);
output += vectors1dim[i];
}
Ten kod jest niepoprawny. Będę bardzo wdzięczny, jeśli ktoś mi odpowie, jeśli teoretycznie możliwe jest równoległe wykonywanie takich zadań, a jeśli tak - to w jaki sposób!
To klasyczny problem redukcji. Spójrz [tutaj] (http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/projects/reduction/doc/reduction.pdf), aby krok po kroku wyjaśnić optymalizację tego procesu dla wielu podstawowe architektury (to CUDA, ale księgi są dokładnie takie same, z wyjątkiem części dotyczącej szablonów). Chociaż niektóre bardziej wstępne materiały na ten temat mogą być bardziej pomocne, ale pozostawiam to właściwej odpowiedzi. –
Dziękuję bardzo! Teraz wiem, że to powszechny problem i nauczę się go jak najlepiej! – Vladimir