La réduction de grands tableaux peut être effectuée en appelant __reduce(); plusieurs fois.OpenCL/CUDA: Algorithme de réduction en deux étapes
Le code suivant utilise cependant que deux étapes et est documenté here:
Cependant, je suis incapable de comprendre l'algorithme de cette réduction en deux étapes. certains peuvent-ils donner une explication plus simple?
__kernel
void reduce(__global float* buffer,
__local float* scratch,
__const int length,
__global float* result) {
int global_index = get_global_id(0);
float accumulator = INFINITY;
// Loop sequentially over chunks of input vector
while (global_index < length) {
float element = buffer[global_index];
accumulator = (accumulator < element) ? accumulator : element;
global_index += get_global_size(0);
}
// Perform parallel reduction
int local_index = get_local_id(0);
scratch[local_index] = accumulator;
barrier(CLK_LOCAL_MEM_FENCE);
for(int offset = get_local_size(0)/2; offset > 0; offset = offset/2) {
if (local_index < offset) {
float other = scratch[local_index + offset];
float mine = scratch[local_index];
scratch[local_index] = (mine < other) ? mine : other;
}
barrier(CLK_LOCAL_MEM_FENCE);
}
if (local_index == 0) {
result[get_group_id(0)] = scratch[0];
}
}
Il peut également être bien mis en œuvre en utilisant CUDA.
Ce code de réduction parallèle est un port OpenCL simple de la réduction CUDA canonique (sans quelques optimisations que OpenCL ne peut pas faire). Il a été écrit par [Mark Harris] (http://stackoverflow.com/users/749748/harrism) de NVIDIA. Vous pouvez trouver un livre blanc très instructif sur l'algorithme dans le SDK CUDA [exemple de réduction] (http://developer.nvidia.com/cuda-cc-sdk-code-samples#reduction). Après avoir lu ce livre blanc, éditez votre question pour expliquer ce que vous ne comprenez pas et que quelqu'un pourrait vous aider. – talonmies
Merci de montrer la bonne direction. Eh bien, je suis confronté à des difficultés à comprendre la différence entre le noyau de réduction en deux étapes et multi-étapes comme indiqué [ici] (http://developer.amd.com/Membership/Print.aspx?ArticleID=221&web=http://developer.amd .com/documentation/articles) – gpuguy