Domanda

Sto allocando un buffer cl_mem su un GPU e lavorare su di esso, che funziona bene fino una certa dimensione viene superata. In tal caso l'allocazione stessa riesce, ma l'esecuzione o la copia non. Io voglio usare la memoria del dispositivo per un funzionamento più veloce in modo da allocare come:

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

Ora quello che non capisco è il limite di dimensione. Sto copiando circa 16 Mbyte, ma dovrebbe essere in grado di utilizzare circa 128 Mbyte (vedi CL_DEVICE_MAX_MEM_ALLOC_SIZE).

Perché questi numeri differiscono così tanto?


Ecco qualche estratto da 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
È stato utile?

Soluzione

clCreateBuffer non effettivamente crea un buffer sul dispositivo. Questo ha senso, dato che al momento della creazione del conducente non sa quale dispositivo utilizzerà il tampone (ricordare che un contesto può avere più dispositivi). Il buffer verrà creata sul dispositivo reale quando si Enqueue una scrittura o quando si avvia un kernel che prende il buffer come parametro.

Per quanto riguarda il limite di 16 MB, stai usando il driver più recente (195.xx)? Se è così è necessario contattare NVIDIA sia attraverso il o direttamente.

Altri suggerimenti

Non dimenticare qualunque altra memoria vi capita di aver usato sul dispositivo (e, se questo è anche la scheda grafica, la memoria che lo schermo utilizza).

(C'è un modo per ottenere la corrente memoria disponibile, o il più grande frammento, o somesuch?)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top