Pergunta

Estou alocar um buffer cl_mem em um GPU e trabalhar sobre ela, que trabalha bem até um certo tamanho é excedido. Nesse caso, a própria alocação for bem sucedida, mas a execução ou a cópia não. Eu quero usar a memória do dispositivo para operação mais rápida, então eu alocar como:

buf = clCreateBuffer (cxGPUContext, CL_MEM_WRITE_ONLY, buf_size, NULL, &ciErrNum);

Agora, o que eu não entendo é o limite de tamanho. Estou copiando cerca de 16 Mbyte, mas deve ser capaz de usar cerca de 128 Mbyte (veja CL_DEVICE_MAX_MEM_ALLOC_SIZE).

Por que estes números diferem tanto?


Aqui está um pouco trecho de oclDeviceQuery:

 CL_PLATFORM_NAME:  NVIDIA
 CL_PLATFORM_VERSION:  OpenCL 1.0 
 OpenCL SDK Version:  4788711

  CL_DEVICE_NAME:          GeForce 8600 GTS
  CL_DEVICE_TYPE:          CL_DEVICE_TYPE_GPU
  CL_DEVICE_ADDRESS_BITS:              32
  CL_DEVICE_MAX_MEM_ALLOC_SIZE:  128 MByte
  CL_DEVICE_GLOBAL_MEM_SIZE:     255 MByte
  CL_DEVICE_LOCAL_MEM_TYPE:      local
  CL_DEVICE_LOCAL_MEM_SIZE:      16 KByte
  CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:  64 KByte
Foi útil?

Solução

clCreateBuffer não vai realmente criar um buffer no dispositivo. Isso faz sentido, já que no momento da criação o motorista não sabe qual o dispositivo que irá utilizar o buffer (lembre-se que um contexto pode ter vários dispositivos). O buffer será criado no dispositivo real quando você enfileirar uma gravação ou quando você lançar um kernel que leva o buffer como um parâmetro.

Quanto ao limite de 16 MB, você está usando o driver mais recente (195.xx)? Se assim for, deve contactar NVIDIA quer através dos fóruns ou diretamente.

Outras dicas

Não se esqueça qualquer outra memória acontecer de você ter usado no dispositivo (e, se esta é também a sua placa gráfica, a memória que o seu monitor está usando).

(Existe uma maneira de obter a corrente de memória disponível, ou o maior fragmento, ou algo assim?)

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