В CUDA предпочтителен непрерывный (не случайный) доступ к памяти из-за возможного использования объединения памяти.Нет ничего сложного в том, чтобы создать массив случайно распределенных индексов и обработать один индекс из A на поток, что-то вроде этого:
__global__ kernel_func(unsigned * A, float * S)
{
const unsigned idx = threadIdx.x + blockIdx.x * blockDim.x;
const unsigned S_idx = A[idx];
S[S_idx] *= 5; // for example...
...
}
Но доступ к памяти в S [произвольный доступ] будет очень медленным (здесь будетбыть наиболее вероятным узким местом).
Если вы решите использовать CUDA, то вы должны много экспериментировать с размерами блоков / сетки, минимизировать потребление регистров на поток (чтобы максимизировать количество блоков на мультипроцессор) и, возможно, отсортировать Aиспользовать ближайший S_ind из ближайших тем ...