Pergunta

Dado o seguinte pedaço de código, gerando um código de tipo de dicionário com CUDA usando impulso (C ++ biblioteca modelo para CUDA):

thrust::device_vector<float> dCodes(codes->begin(), codes->end());
thrust::device_vector<int> dCounts(counts->begin(), counts->end());
thrust::device_vector<int> newCounts(counts->size());

for (int i = 0; i < dCodes.size(); i++) {
    float code = dCodes[i];
    int count = thrust::count(dCodes.begin(), dCodes.end(), code);

    newCounts[i] = dCounts[i] + count;

    //Had we already a count in one of the last runs?
    if (dCounts[i] > 0) {
        newCounts[i]--;
    }

    //Remove
    thrust::detail::normal_iterator<thrust::device_ptr<float> > newEnd = thrust::remove(dCodes.begin()+i+1, dCodes.end(), code);
    int dist = thrust::distance(dCodes.begin(), newEnd);
    dCodes.resize(dist);
    newCounts.resize(dist);
}

codes->resize(dCodes.size());
counts->resize(newCounts.size());

thrust::copy(dCodes.begin(), dCodes.end(), codes->begin());
thrust::copy(newCounts.begin(), newCounts.end(), counts->begin());

O problema é que eu tenho notado várias cópias de 4 bytes, usando CUDA profiler visual. IMO este é gerado pelo

  1. O contador de loop i
  2. código flutuador , int count e dist
  3. Cada acesso ao i e as variáveis ??citadas acima

Este parece abrandar tudo (cópia seqüencial de 4 bytes não é divertido ...).

Então, como eu estou dizendo a empurrar, que essas variáveis ??devem ser tratadas no dispositivo? Ou são já?

Usando o impulso :: device_ptr não parece ser suficiente para mim, porque eu não tenho certeza se o loop for em torno executado em host ou no dispositivo (que também poderia ser outra razão para o slowliness).

Foi útil?

Solução

para cada reiteração de i, dimensão, o índice, código, etc. tem que ser copiado a partir do host para o dispositivo .. a forma como você tem o seu programa, não há muito que você pode fazer. Para melhores resultados, considere mover toda circuito i no dispositivo, desta forma você não terá hospedeiro para cópias de dispositivo.

A confiança é grande para algumas coisas, no entanto, onde o desempenho está em causa e algoritmo não se encaixam perfeitamente as funções disponíveis, você pode ter que reescrever para o melhor desempenho sem o uso de algoritmos de empuxo explicitamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top