Pergunta

estou experimentando OpenCL para aumentar a velocidade do nosso software.Trabalhamos muito com mapas e, para simplificar, representamos um mapa como um std::vector< std::vector >.A API OpenCL usa ponteiros brutos no estilo C como argumentos, por exemplo int* no caso acima.

Minhas perguntas:

  • Existem garantias de implementação no stl de que o vetor é, internamente, consecutivo na memória?
  • Posso lançar com segurança um std::vector para int* e esperar que funcione?
  • No caso de um vetor de vetores, ainda posso assumir que isso é verdade?Eu esperaria que o vetor contivesse outros dados de estado, ou problemas de alinhamento, ou talvez algo mais...
  • Qual é a melhor maneira de abordar isso?Escreva uma estrutura de dados 2D personalizada que contenha um buffer interno contíguo na memória e trabalhe com isso?Eu teria que copiar muito de/para vetores ...

Obrigado.

Foi útil?

Solução

Existem garantias de implementação no STL de que o vetor é, internamente, consecutivo na memória?

A partir de C ++ 03, sim, é garantido que um vetor use o armazenamento contíguo. (Em C ++ 98, houve uma brecha acidental para que uma implementação pudesse usar hipoteticamente o armazenamento não contíguo, mas foi corrigido na revisão de 2003 do padrão - e nenhuma implementação realmente usado armazenamento não contíguo porque seria uma ideia terrível)

Posso lançar com segurança um vetor de std :: para int* e esperar que isso funcione?

A maneira usual é &v[0]. (&*v.begin() Provavelmente funcionaria também, mas pareço lembrar que há alguma redação fofa no padrão que torna isso não 100% confiável)

Não. Por que você esperaria que isso funcionasse? Um vetor é uma classe. Não é um ponteiro. É só contém um ponteiro.

No caso de um vetor de vetores, ainda posso assumir que isso é verdade? Eu esperaria que o vetor mantenha outros dados do estado, ou problemas de alinhamento, ou talvez outra coisa ...

O vetor se comporta o mesmo que você armazena nele. Se você fizer um vetor de vetores, acaba com um objeto que contém um ponteiro para uma matriz alocada por heap, onde cada elemento é um objeto que contém um ponteiro para uma matriz alocada por heap.

Quanto à forma como você deve abordar isso, depende de muitos fatores. Qual é o tamanho do seu conjunto de dados total? Você pode querer ter a tabela inteira alocada de forma contigula. Com um vetor de vetores, cada linha é uma alocação separada.

Outras dicas

  • Existem garantias de implementação no stl de que o vetor é,
    internamente, consecutivo na memória

Sim, é uma matriz dinâmica.O padrão garante que os objetos dentro do vetor sejam armazenados consecutivamente.

  • Posso lançar com segurança um std::vector para int* e esperar que funcione?

Não, mas você pode usar Begin() e usá-lo como ponteiro.

  • Existem garantias de implementação no stl de que o vetor é,
    internamente, consecutivo na memória

Não, como o vetor pode conter algumas variáveis ​​de membros internos, todo o array 2D não será um local de memória contínuo

Existem garantias de implementação no STL de que o vetor é, internamente, consecutivo na memória?

Embora eu não possa citar os padrões aqui, vi código em bibliotecas de alta qualidade assumindo esse layout (a saber, Poco).

Posso lançar com segurança um vetor de std :: para int* e esperar que isso funcione?

Especificamente, você não pode reformular o próprio vetor. Mas, eu vi o seguinte código:

std::vector<int> vec;
int* ptr = &vec[0];

No caso de um vetor de vetores, ainda posso assumir que isso é verdade? Eu esperaria que o vetor mantenha outros dados do estado, ou problemas de alinhamento, ou talvez outra coisa ...

Você provavelmente não pode lançar um vetor de vetores para uma matriz linear. Cada vetor reservará seu próprio intervalo de memória e você não pode esperar que todos esses intervalos sejam seqüenciais.

Você mencionou em um comentário que trabalha com até 2500x2500xSizeof (duplo) dados. Nesse caso, eu sugeriria usar um único vetor em vez de vetor de vetores. Aloce elementos NXM em um vetor e envolva-o em uma classe que exponha a indexação bidimensional, se desejar. Você obtém todos os benefícios do vetor com sobrecarga mínima e todos os seus dados ainda estão em memória contígua para processamento rápido.

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