Logo Hardware.com.br
ricardo.calister
ricardo.cali... Novo Membro Registrado
18 Mensagens 0 Curtidas

Compilador_C++

#1 Por ricardo.cali... 15/02/2014 - 17:15
Olá a todos
eu preciso de uma ajuda, neste momento eu estou usando o compilador g++ para a versão linux, eu preciso declarar vetores estáticos do tipo float. No meu programa eu preciso declarar 20 vetores float com 4.1x10 ^ 6 elementos cada. mas o compilador permite declarar 2.9x10 ^ 5 para cada vetor. é possível a utilização de mais memória para vetor estatico com g++? Existe algum compilador para C++ (para linux) que permiti a fazer isso?
Eu uso o Ubuntu 12.04 LTS, eu tenho um computador com (1,5 GB de memória RAM e outro com 3 GB de memória RAM), mas eu posso declarar apenas 2,9 x10 ^ 5 mesmo quando eu estou usando o dobro de memória RAM(tanto faz usar 1,5G ou 3GBytes). Declaro as variáveis na área geral (antes do principal main() e das funções e classes), ou seja, fora da área de pilha.

Eu testei gfortran (compilador Fortran) que permitem declarar mais, vetores estáticos, mas porém meu código está em C ++! também eu não posso usar vetor dinâmico.

Por favor, alguém poderia me ajudar?

Obrigado !

Ricardo
ricardo.calister
ricardo.cali... Novo Membro Registrado
18 Mensagens 0 Curtidas
#16 Por ricardo.cali...
05/03/2014 - 17:19
Olá Intruso,

bom montar as equações com vetores estáticos é bem rápido, quase não demanda tempo, mas se eu montar uma alocação dinâmica com lista ligada "simples", a coisa em termos de tempo não fica nada boa.

Em meu programa eu também uso muitas multiplicações de matrizes por vetores para obter novos vetores, mas eu uso uma técnica que vetoriza matrizes, então equações do tipo Ao*f0+B*f310+C0*f8000+...=Q0 há em várias partes do programa principalmente quando resolvo os sitemas lineares gerados, com vetores estáticos é tudo rápido e mesmo a sintaxe para escrever é bem simples..então mudar muito a sintaxe ou mesmo a linguagem de programação significa tempo e retrabalho...no meu progarma há muitos termos assim:

r0[l-1]=dat2->Q[l-1]-dat2->AW[l-1]*dat2->f[l-1-nj]-dat2->AS[l-1]*dat2->f[l-2]-dat2->AB[l-1]*dat2->f[l-1-ni*nj]-dat2->AD[l-1]*dat2->f[l-1-ni*nj*nk]-dat2->ADT[l-1]*dat2->f[l-1-(ni*nj*nk-ni*nj)]-dat2->ADB[l-1]*dat2->f[l-1-(ni*nj*nk+ni*nj)]-dat2->AP[l-1]*dat2->f[l-1];

pego várias posições de f.

Sim o aumento é exponencial, elevado a quarta potência..eu pensava que o compilador g++ somente está configurado para deixar até um certo nível de memória estatática..já um gfortran aloca muito mais..talvez deve existir algum modo de configurar o compilador, ou mesmo um outro compilador C++ que deixe alocar mais, pois se o Fortran aloca, não é problema de hardware.

Meu sistema é todo 32 bit's tenho um computador com pentium 4(3,2GHz) memória Ram de 1.5Gb , com ubuntu 12,04LTS e uso o g++ com codeblocks , uso também outra máquina com pentium dualcore (2GHz) memória RAM 3Gb, com ubuntu 13.10 e e também uso o g++ com o codeblocks...com o g++ tanto faz o computador ter 1,5 GB ou 3 Gb de RAM, ele aloca o mesmo tamanho para os vetores estáticos... então o que o g++ permite alocar para vetores estáticos deve estar longe da limitação física de memória..
Bom, meus vetores todos são do tipo float..alguns vetores falgś são do tipo int.

o código para retornar o que pediu é assim ?

#include

using namespace std;

std::vector::max_size()

int main(void){
}

ou o std::vector::max_size(), vai dentro da função principal main() ?

Abs
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas
#17 Por intruso
06/03/2014 - 23:43
ricardo.calister disse:


Seria uma alternativa.

ricardo.calister disse:


Não. Linguagens diferentes possuem implementações e paradigmas diferentes, algumas nem chegam a alocar a memória antes de usar, como falei antes, cada uma tem suas particularidades.

Pelo que pesquisei, o limite dos vetores em C/C++ é devido a arquitetura. 32 bits implica um indice maximo um inteiro maximo para usar como indice de 2^32.

O outro limite, seria a memória.

ricardo.calister disse:


outra alternativa, que me parece razoavel, é testar o mesmo código em uma maquina com arquitetura de 64 bits.

ricardo.calister disse:



Testa esse aqui, só pra confirmar, quero ver se o tamanho vai variar de arquitetura de na forma que te falei antes:


// comparing size, capacity and max_size
#include <iostream>
#include <vector>

int main ()
{
std::vector<char> vectorChar;
std::vector<int> vectorInt;
std::vector<float> vectorFloat;
std::vector<double> vectorDouble;

// set some content in the vector:
for (int i=0; i<100; i++) vectorChar.push_back(i);
for (int i=0; i<100; i++) vectorInt.push_back(i);
for (int i=0; i<100; i++) vectorFloat.push_back(i);
for (int i=0; i<100; i++) vectorDouble.push_back(i);

std::cout << "Char " << "\n";
std::cout << "size: " << vectorChar.size() << "\n";
std::cout << "capacity: " << vectorChar.capacity() << "\n";
std::cout << "max_size: " << vectorChar.max_size() << "\n";

std::cout << "Int " << "\n";
std::cout << "size: " << vectorInt.size() << "\n";
std::cout << "capacity: " << vectorInt.capacity() << "\n";
std::cout << "max_size: " << vectorInt.max_size() << "\n";

std::cout << "Float " << "\n";
std::cout << "size: " << vectorFloat.size() << "\n";
std::cout << "capacity: " << vectorFloat.capacity() << "\n";
std::cout << "max_size: " << vectorFloat.max_size() << "\n";

std::cout << "Double " << "\n";
std::cout << "size: " << vectorDouble.size() << "\n";
std::cout << "capacity: " << vectorDouble.capacity() << "\n";
std::cout << "max_size: " << vectorDouble.max_size() << "\n";


return 0;
}

ricardo.calister
ricardo.cali... Novo Membro Registrado
18 Mensagens 0 Curtidas
#18 Por ricardo.cali...
07/03/2014 - 10:34
Olá,

Eu rodei o programa que você me forneceu o código e o resultado para ambas as máquinas(Pentium 4(3,2GHz) RAM de somente 1,5GB e Ubuntu 12,04LTS 32 bits e Pentium dualcore (2GHZ) RAM de 3GB e Ubuntu 13.10 32bits) foram:

char
size:100
capacity:128
max_size:4294967295

Int
size:100
capacity:128
max_size:1073741823

Float
size:100
capacity:128
max_size:1073741823

Double
size:100
capacity:128
max_size:536870911

Eu achei também um fórum da Unicamp que fala um pouco sobre o problema, como você entende mais disso que eu, de uma olhada..
no fim o professor Alberto Saa, consegue alocar e rodar o programa no windows vista !

Obrigado

Abraço
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas
#20 Por intruso
07/03/2014 - 13:58
ricardo.calister disse:


Cara,

pelo que notei o problema é sua arquitetura mesmo, também fiz uma pesquisa e em todos os casos, o "problema" foi o espaço de endereçamento.

No stackoverflow tem várias perguntas e a resposta é sempre a mesma, eu rodei o mesmo programa na minha máquina, com o mesmo compilador e o resultado foi muito maior para cada tipo. Se você reparar o size max é uma potencia de 2, elevando a 32 bits menos 1, onde o tamanho máximo é divido pelo tamanho do tipo em bytes, quanto maior o tipo, menor o maximo.

Isso é um limite de arquitetura (endereçamento) e não de memória.

Como não tenho os detalhes de seu código e sistema, sugiro um teste simples, rodar o programa em uma máquina com 64bits (lembre que o SO também tem que ser 64 bits).

Se você rodar o programa que te enviei em uma máquina de 64bits, vai ver que de cara o size é muito superior ao que você está trabalhando, porque minha máquina e SO são de 64 bits.

Amanhã te envio os meus valores porque hoje estou sem acesso a minha máquina smile.png

Segue um exemplo de onde eu encontrei a resposta:

http://stackoverflow.com/questions/216259/is-there-a-max-array-length-limit-in-c

Tem varios posts desses lá.
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#21 Por ripongao
07/03/2014 - 19:33
acompanhei o tópico mas não posso ajudar como gostaria, a sugestão do intruso é ótima, vetores e ponteiros, falo isso do ponto de vista de programador assembly, é o jeito mais rápido que todas as arquiteturas que conheço trabalham. Ah, e vetor alinhado em múltiplo de 4 bytes viu, se fosse 64 bits então alinhado para 8 bytes, se usar instruções (vide abaixo) mmx alinhado para 8 bytes, se for para SSE então 16 bytes (o processador de 32 bits consegue manipular dados de 64 bits usando essas instruções (caso suporte) sem que para isso o senhor tenha de estar usando um S.O. de 64 bits). Se os dados estiverem picados, refaça a estrutura usada, coloque espaços vazios (mais memória sendo gasta) apenas para alinhar o próximo dado na memória (melhor performance).
Pegue por exemplo mmx,sse,sse2,sse3,sse4,sse4.1, os processadores citados por tí oferecem esses conjuntos de instruções, essas instruções inseridas no processadores oferecem justamente algo como manipular dados interpolados/mixados (multiplicações de matrizes por vetores), conhecendo-se o tamanho dos mesmos claro (32 bits com sinal ou sem?).
Creio que tenha alguma linha de comandos que força o compilador a usar determinada tecnologia, digo, determinado conjunto de instruções, fuce aí.

"Arquivos mapeados na memória" (CreateFileMapping no windows) são mais rápidos do que gerenciados pelo disco, já que um tem partes mecânicas e atrasa demais o processo de leitura/escrita. Quando o buffer satura aí ele vai para o disco fazer o swap.

Devido a estar com vários dados/vetores, fique no S.O. de 32 bits pois o endereço/ponteiro é menor e com isso menor será o tamanho da memória necessária.

Dê uma lida nos textos do Agner Fog (em inglês) o cara é fodástico em otimização. Faça um teste depois usando as funções/biblioteca que ele disponibiliza em seu site ao invés das nativas usadas por C++ em seu programa e veja a diferença na performance. É inclusive assim que turbino o gnu linux já que no windows não posso fazê-lo legalmente falando.
Desliguei-me do fórum. Conta canelada.
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas
#22 Por intruso
07/03/2014 - 20:49
ripongao disse:


Ripongao,

O problema dele na verdade é o limite de endereçamento usado para alocação de vetores estáticos, ele está usando uma maquina de 32 bits e precisa alocar um vetor maior do que o maior vetor possivel smile.png

So que o compilador não deixa, se o codigo dele funcionasse, ele teoricamente estaria feliz com a performance.

Muito bom seu link cara, não tinha visto.

abs
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#23 Por ripongao
08/03/2014 - 02:26
Mas ô intruso, se entendí o problema, ele disse no 1o post:
ricardo.calister disse:

20 vetores do tipo float com 4.100.000 elementos == 4100000x32 bitsx20 == 2.624.000.000 bits == 328.000.000 bytes; 32 bits endereçam 4 gigabytes e o tanto de memória que a máquina dele possui consegue alocar memória para isso, ficou na casa de megas, então suporta não?.
O problema pelo que percebí é que ele não esta conseguindo inserir vetores/tabelas estáticas gigantes (megas) no executável final, o compilador limita-o, mas caso dinâmicas aí entra o fator performance. Essa limitação acontece com assemblers, existe um limite também, agora esquecí o tamanho daí a sugestão de arquivos mapeados na memória.
Bom, perdão se entendí errado o problema, lembrando que não entendo nada de c++ daí não poder ajudar com exemplos.
--------editado após--------
só se ele esta inserindo strings do tipo float ao invés do float em binário, aí sim, mas, na máquina de 3 gigas funcionaria não? Hmm, o compilador converte não?
---------fim do editado após

O link é de um professor ou phd, algo assim, aprendí muito lendo os textos dele, já lí umas 3 ou 4 vezes; são livros que estão sempre à mão; veja na parte offtopic do site que ele diz que programas compilados pelo compilador da intel são executados mais rapidamente em processadores intel, digo; o programa sabe que esta sendo executado num amd (instrução cpuid) e com isso executa funções menos otimizadas, com isso fazendo benchmarks favorecerem a intel; sinistro né. Ele disponibiliza um código para medir desempenho de pequenas funções, mas por usar instruções privilegiadas (ring 0, medidores de performance) é preciso um driver/módulo, e como no windows a partir do vista tem aquele lance de verificar assinatura o mesmo é mais fácil de se brincar pelo linux qualquer versão.
Desliguei-me do fórum. Conta canelada.
ricardo.calister
ricardo.cali... Novo Membro Registrado
18 Mensagens 0 Curtidas
#24 Por ricardo.cali...
10/03/2014 - 10:09
Bom, acho que o problema é por aí..
Infelizmente não tenho acesso a uma máquina com arquitetura 64 bits..o jeito é instalar o ubuntu 64 bits, só tenho que verse os processadores dos computadores são 64 bits e se a configuração de memória é suficiente..acho que o Pentium 4 é 64bits (nesta máquina tenho pouca memória), não sei o quanto o desempenho ficará prejudicado..
No outro computador ,um notebook, já tenho o dobro (3GB) o processador é pentiumdual core..preciso ter certeza que o processador é 64bits.

Quando puder então me envie os valores dos vetores alocados em sua máquina de 64bits..

muito obrigado por sua ajuda !

Abraço
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#25 Por ripongao
10/03/2014 - 11:30
O dual core suporta x86-64, falta ver o Pentium 4; para isso é só ir no site da intel, baixar o manual e ver se suporta o 'long mode'.

No linux, você pode fazer o comando:
cat /proc/cpuinfo
Será retornado informações do processador, você tem que procurar por 'lm', se tiver, suporta 64 bits, digo, x86-64 pois a intel lançou o Itanium, esse sim é só 64 bits, e para diferenciar, o pessoal chama de x86-64.

exemplo de um dual core e2160 que suporta 64 bits:
[code=rich]
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Pentium(R) Dual CPU E2160 @ 1.80GHz
stepping : 11
microcode : 0xba
cpu MHz : 1799.921
cache size : 1024 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx
lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni
dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm
bogomips : 3599.84
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
[/code]como pode observar nas flags, o dual core suporta instruções mmx sse sse2 ssse3, msr (para conferir performance), .... .
Repare que ele não endereça 64 bits de endereços físicos, e tampouco virtual; digo, o senhor não conseguirá xuxar tanta memória assim nele mesmo se desejar.
Desliguei-me do fórum. Conta canelada.
ricardo.calister
ricardo.cali... Novo Membro Registrado
18 Mensagens 0 Curtidas
#26 Por ricardo.cali...
11/03/2014 - 11:23
ripongao disse:



Olá,

è isto que vc disse, mas tanto faz a máquina ter 1,5GB ou 3GB, com o SO , Ubuntu de 32 bits com o compilador g++ ela aloca igual em ambas as máquinas..apesar de 32bits endereçarem 4 gigabytes...deve ser o compilador mesmo que limita..bom pelo que o Intruso escreveu usando um SO de 64bits e o mesmo g++ ele conseguiu alocar muito mais...então talvez a solução mais simples é usar um SO de 64 bits..! meu problema físico é muito complicado..e se encontrar algo mais simples em termos computacional, para mim é melhor..foca mais na física do problema..

Bom, pelo que entendi 0 pentium dual Core pode ser usado em 64 bits ? o o da minha máquina é o modelo T3200 de 2GHz com 3GB de RAM , acho que o pentium 4 é 64 bits, mas com pouca memória que tenho será que as máquinas funcionam bem em 64 bits ? a máquina com pentium 4 a memória é mais antiga..bom como sou estudante o dinheiro é limitado para comprar hardware no momento...somente quando terminar o curso é que terei uma bolsa melhor e poderei comprar um hardware melhor.

O que Acham ?

Obrigado ambos pela atenção..

Abraço
ripongao
ripongao Veterano Registrado
755 Mensagens 94 Curtidas
#27 Por ripongao
11/03/2014 - 22:52
A convenção de chamadas nos 64 bits é mais rápida, o senhor terá melhor performance, em contrapartida mais memória será necessário. O senhor não pprecisa trocar de máquina, o tamanho de memória preciso esta na casa de megas e não gigas pelo que entendi.
Crie arquivos com os vetores/tabelas, os carregue na memória pelo seu programa e use os ponnteiros como dito pelo intruso. Essa limitação existe em todos os compiladores que conheço.

De uma lida no link que postei, vai te ajudar pra caramba.
qualquer duvida poste e tentarei aajudar com comentários, já que não programo nesta linguagem.

Tô sem net então posso demorar a responder.
Desliguei-me do fórum. Conta canelada.
ricardo.calister
ricardo.cali... Novo Membro Registrado
18 Mensagens 0 Curtidas
#28 Por ricardo.cali...
27/03/2014 - 10:46
Olá Pessoal,

Eu consegui um notebook emprestado com procesador I3 e com 4GigaBytes de RAM, instalei o Ubuntu 12.04LTS 64bits, bom realmente conforme o código que o Intruso me enviou, consegui melhorar bastante a alocação de vetores :

Char
size: 100
capacity: 128
max_size: 18446744073709551615

Int
size: 100
capacity: 128

max_size: 4611686018427387903
Float
size: 100
capacity: 128

max_size: 4611686018427387903
Double
size: 100
capacity: 128

max_size: 2305843009213693951

Mas para meu programa específico, nada mudou, quando aumento o número de vetores, o desempenho é igual ao que tinha no computador Pentium 4 com 1,5Gbytes com Ubuntu 12.04LTS 32bits..., ou seja , o compilador retorna:

Segmentation fault (core dumped)

Process returned 139(0x8B)

frown.png estava certo era somente problema de arquitetura, e alterando-a iria resolver uma vez que aloco mais vetores..mas no meu programa nada mudou..
ricardo.calister
ricardo.cali... Novo Membro Registrado
18 Mensagens 0 Curtidas
#30 Por ricardo.cali...
28/03/2014 - 11:16
Olá,

Sim, recompilei na máquina emprestada. Mas estou conferindo novamente o código e há alguns vetores que declarei dentro das classes (cada método numérico eu criei uma classe), e me dei conta que estes objetos eu declarei dentro de outras funções que são chamadas na função principal main(), ou seja, na área de pilha com restrição na memória, vou verificar isso com calma e depois comento aqui.

Abraço
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal