VRAM-Allocator CUDA Version

@Downsampler: Verwendest du auch die Version aus #52? Auch über CMD kannst du mehrere Instanzen starten.
 
Na klar, die aus Post #52.

Ich bin gerade am recherchieren, ob es memory limits gibt bei clcreatebuffer. Anscheinend ist es auf 4 GB begrenzt je Buffer, was irgendwie impliziert, daß man mehrere Buffer erstellen kann in einer queue.

Wenn es mein Programm wäre, würde ich versuchen, die Gesamtmenge in 512 MB Buffer über mehrere Buffer aufzuteilen.

Au mann gleich packt es mich wieder und ich installiere mir eine Entwicklunsumgebung in einer VM. Vor etlichen Jahren habe ich mal mit dem AMD Brook herumgespielt. Leider war es immer Beta und wurde nie fertig. Irgendwann haben sie es zugunsten von OpenCL dann eingestampft. Aber vieles in OpenCL ist ähnlich wie in Brook.
 
Zuletzt bearbeitet:
Hier der 64bit Multi-Buffer-Ansatz.
Code:
[COLOR=#57a64a]// OpenCLVRAMAllocator.cpp : Diese Datei enthält die Funktion "main". Hier beginnt und endet die Ausführung des Programms.[COLOR=#57a64a]// 
[COLOR=#9b9b9b]#include [COLOR=#d69d85]"pch.h"[COLOR=#9b9b9b]#include [COLOR=#d69d85]<stdio.h>[COLOR=#9b9b9b]#include [COLOR=#d69d85]<CL/cl.h>[COLOR=#9b9b9b]#include [COLOR=#d69d85]<stdlib.h>[COLOR=#9b9b9b]#include [COLOR=#d69d85]<exception>[COLOR=#569cd6]using [COLOR=#569cd6]namespace [COLOR=#c8c8c8]std[COLOR=#b4b4b4]; 
[COLOR=#569cd6]int [COLOR=#c8c8c8]main[COLOR=#b4b4b4]([COLOR=#569cd6]int [COLOR=#7f7f7f]argc[COLOR=#b4b4b4], [COLOR=#569cd6]char [COLOR=#b4b4b4]*[COLOR=#7f7f7f]argv[COLOR=#b4b4b4][])[COLOR=#b4b4b4]{    [COLOR=#569cd6]const [COLOR=#4ec9b0]size_t [COLOR=#c8c8c8]packet_size [COLOR=#b4b4b4]= [COLOR=#b5cea8]1000[COLOR=#b4b4b4]; 
    [COLOR=#4ec9b0]size_t [COLOR=#c8c8c8]mem_size [COLOR=#b4b4b4]= [COLOR=#b5cea8]0[COLOR=#b4b4b4];    [COLOR=#4ec9b0]cl_int [COLOR=#c8c8c8]err[COLOR=#b4b4b4]; [COLOR=#57a64a]// error code    [COLOR=#4ec9b0]cl_device_id [COLOR=#c8c8c8]device_id[COLOR=#b4b4b4]; [COLOR=#57a64a]// compute device id    [COLOR=#4ec9b0]cl_context [COLOR=#c8c8c8]context[COLOR=#b4b4b4]; [COLOR=#57a64a]// compute context    [COLOR=#4ec9b0]cl_mem[COLOR=#b4b4b4]* [COLOR=#c8c8c8]devTestMem[COLOR=#b4b4b4];    [COLOR=#4ec9b0]cl_mem [COLOR=#c8c8c8]remainderMem [COLOR=#b4b4b4]= [COLOR=#bd63c5]NULL[COLOR=#b4b4b4];    [COLOR=#4ec9b0]cl_uint [COLOR=#c8c8c8]num_devices[COLOR=#b4b4b4];    [COLOR=#4ec9b0]cl_platform_id [COLOR=#c8c8c8]platformId[COLOR=#b4b4b4];    [COLOR=#4ec9b0]cl_uint [COLOR=#c8c8c8]numPlatforms [COLOR=#b4b4b4]= [COLOR=#b5cea8]0[COLOR=#b4b4b4];    [COLOR=#4ec9b0]cl_uint [COLOR=#c8c8c8]ret_num_devices[COLOR=#b4b4b4];    [COLOR=#4ec9b0]cl_uint [COLOR=#c8c8c8]ret_num_platforms[COLOR=#b4b4b4];    [COLOR=#4ec9b0]cl_int [COLOR=#c8c8c8]fillValue [COLOR=#b4b4b4]= [COLOR=#b5cea8]255[COLOR=#b4b4b4]; 
    [COLOR=#57a64a]// query the number of platforms    [COLOR=#c8c8c8]err [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clGetPlatformIDs[COLOR=#b4b4b4]([COLOR=#b5cea8]0[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]numPlatforms[COLOR=#b4b4b4]); 
    [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]!= [COLOR=#bd63c5]CL_SUCCESS[COLOR=#b4b4b4])    [COLOR=#b4b4b4]{        [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error: Failed to number of platforms!\n"[COLOR=#b4b4b4]);        [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];    [COLOR=#b4b4b4]} 
    [COLOR=#57a64a]// now get all the platform IDs    [COLOR=#4ec9b0]cl_platform_id[COLOR=#b4b4b4]* [COLOR=#c8c8c8]platforms [COLOR=#b4b4b4]= [COLOR=#569cd6]new [COLOR=#4ec9b0]cl_platform_id[COLOR=#b4b4b4][[COLOR=#c8c8c8]numPlatforms[COLOR=#b4b4b4]];    [COLOR=#c8c8c8]err [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clGetPlatformIDs[COLOR=#b4b4b4]([COLOR=#c8c8c8]numPlatforms[COLOR=#b4b4b4], [COLOR=#c8c8c8]platforms[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]ret_num_platforms[COLOR=#b4b4b4]); 
    [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]!= [COLOR=#bd63c5]CL_SUCCESS[COLOR=#b4b4b4])    [COLOR=#b4b4b4]{        [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error: Failed to get platform IDs!\n"[COLOR=#b4b4b4]);        [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];    [COLOR=#b4b4b4]} 
    [COLOR=#57a64a]// set platform property - we just pick the first one    [COLOR=#4ec9b0]cl_context_properties [COLOR=#c8c8c8]properties[COLOR=#b4b4b4][] [COLOR=#b4b4b4]= [COLOR=#b4b4b4]{ [COLOR=#bd63c5]CL_CONTEXT_PLATFORM[COLOR=#b4b4b4], [COLOR=#b4b4b4]([COLOR=#4ec9b0]cl_context_properties[COLOR=#b4b4b4])[COLOR=#c8c8c8]platforms[COLOR=#b4b4b4][[COLOR=#b5cea8]0[COLOR=#b4b4b4]], [COLOR=#b5cea8]0 [COLOR=#b4b4b4]}; 
    [COLOR=#c8c8c8]err [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clGetDeviceIDs[COLOR=#b4b4b4]([COLOR=#c8c8c8]platforms[COLOR=#b4b4b4][[COLOR=#b5cea8]0[COLOR=#b4b4b4]], [COLOR=#bd63c5]CL_DEVICE_TYPE_GPU[COLOR=#b4b4b4], [COLOR=#b5cea8]1[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]device_id[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]ret_num_devices[COLOR=#b4b4b4]); 
    [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]!= [COLOR=#bd63c5]CL_SUCCESS[COLOR=#b4b4b4])    [COLOR=#b4b4b4]{        [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error: Failed to create a device group!\n"[COLOR=#b4b4b4]); 
        [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_PLATFORM[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error: CL_INVALID_PLATFORM\n"[COLOR=#b4b4b4]);        [COLOR=#b4b4b4]}        [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_DEVICE_TYPE[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error: CL_INVALID_DEVICE_TYPE\n"[COLOR=#b4b4b4]);        [COLOR=#b4b4b4]}        [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_VALUE[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error: CL_INVALID_VALUE\n"[COLOR=#b4b4b4]);        [COLOR=#b4b4b4]}        [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_DEVICE_NOT_FOUND[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error: CL_DEVICE_NOT_FOUND\n"[COLOR=#b4b4b4]);        [COLOR=#b4b4b4]}        [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];    [COLOR=#b4b4b4]} 
    [COLOR=#569cd6]try    [COLOR=#b4b4b4]{        [COLOR=#c8c8c8]context [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clCreateContextFromType[COLOR=#b4b4b4]([COLOR=#c8c8c8]properties[COLOR=#b4b4b4], [COLOR=#bd63c5]CL_DEVICE_TYPE_GPU[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]err[COLOR=#b4b4b4]);    [COLOR=#b4b4b4]}    [COLOR=#569cd6]catch [COLOR=#b4b4b4]([COLOR=#569cd6]const [COLOR=#c8c8c8]std[COLOR=#b4b4b4]::[COLOR=#4ec9b0]exception[COLOR=#b4b4b4]& [COLOR=#c8c8c8]e[COLOR=#b4b4b4])    [COLOR=#b4b4b4]{        [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#c8c8c8]e[COLOR=#b4b4b4].[COLOR=#c8c8c8]what[COLOR=#b4b4b4]());        [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];    [COLOR=#b4b4b4]} 
    [COLOR=#569cd6]if [COLOR=#b4b4b4](![COLOR=#c8c8c8]context[COLOR=#b4b4b4])    [COLOR=#b4b4b4]{        [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error: Failed to create a compute context!\n"[COLOR=#b4b4b4]);        [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];    [COLOR=#b4b4b4]} 
    [COLOR=#57a64a]// get amount of memory to allocate in MB, default to 256    [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#7f7f7f]argc [COLOR=#b4b4b4]< [COLOR=#b5cea8]2 [COLOR=#b4b4b4]|| [COLOR=#c8c8c8]sscanf_s[COLOR=#b4b4b4]([COLOR=#7f7f7f]argv[COLOR=#b4b4b4][[COLOR=#b5cea8]1[COLOR=#b4b4b4]], [COLOR=#d69d85]" %u"[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]mem_size[COLOR=#b4b4b4]) [COLOR=#b4b4b4]!= [COLOR=#b5cea8]1[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{        [COLOR=#c8c8c8]mem_size [COLOR=#b4b4b4]= [COLOR=#b5cea8]256[COLOR=#b4b4b4];    [COLOR=#b4b4b4]} 
    [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"%u bytes will be allocated.\n"[COLOR=#b4b4b4], [COLOR=#c8c8c8]mem_size [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024 [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024[COLOR=#b4b4b4]); 
    [COLOR=#57a64a]// Dividing without remainder    [COLOR=#4ec9b0]size_t [COLOR=#c8c8c8]numOfPackets [COLOR=#b4b4b4]= [COLOR=#c8c8c8]mem_size [COLOR=#b4b4b4]/ [COLOR=#c8c8c8]packet_size[COLOR=#b4b4b4];    [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Number of packets without division remainder based on 1000MB packet size: %u.\n"[COLOR=#b4b4b4], [COLOR=#c8c8c8]numOfPackets[COLOR=#b4b4b4]); 
    [COLOR=#c8c8c8]devTestMem [COLOR=#b4b4b4]= [COLOR=#569cd6]new [COLOR=#4ec9b0]cl_mem[COLOR=#b4b4b4][[COLOR=#c8c8c8]numOfPackets[COLOR=#b4b4b4]]; 
    [COLOR=#569cd6]for [COLOR=#b4b4b4]([COLOR=#4ec9b0]size_t [COLOR=#c8c8c8]i [COLOR=#b4b4b4]= [COLOR=#b5cea8]0[COLOR=#b4b4b4]; [COLOR=#c8c8c8]i [COLOR=#b4b4b4]< [COLOR=#c8c8c8]numOfPackets[COLOR=#b4b4b4]; [COLOR=#c8c8c8]i[COLOR=#b4b4b4]++)    [COLOR=#b4b4b4]{        [COLOR=#57a64a]// allocate GPU memory and convert MB to bytes        [COLOR=#c8c8c8]devTestMem[COLOR=#b4b4b4][[COLOR=#c8c8c8]i[COLOR=#b4b4b4]] [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clCreateBuffer[COLOR=#b4b4b4]([COLOR=#c8c8c8]context[COLOR=#b4b4b4], [COLOR=#bd63c5]CL_MEM_READ_WRITE[COLOR=#b4b4b4], [COLOR=#c8c8c8]packet_size [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024 [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]err[COLOR=#b4b4b4]); 
        [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]!= [COLOR=#bd63c5]CL_SUCCESS[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error, could not allocate %u bytes.\n"[COLOR=#b4b4b4], [COLOR=#c8c8c8]packet_size [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024 [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024[COLOR=#b4b4b4]);            [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];        [COLOR=#b4b4b4]}    [COLOR=#b4b4b4]} 
    [COLOR=#4ec9b0]cl_command_queue [COLOR=#c8c8c8]command_queue [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clCreateCommandQueueWithProperties[COLOR=#b4b4b4]([COLOR=#c8c8c8]context[COLOR=#b4b4b4], [COLOR=#c8c8c8]device_id[COLOR=#b4b4b4], [COLOR=#b5cea8]0[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]err[COLOR=#b4b4b4]); 
    [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]!= [COLOR=#bd63c5]CL_SUCCESS[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{        [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error, could not create queue\n"[COLOR=#b4b4b4]);        [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];    [COLOR=#b4b4b4]} 
    [COLOR=#569cd6]for [COLOR=#b4b4b4]([COLOR=#4ec9b0]size_t [COLOR=#c8c8c8]i [COLOR=#b4b4b4]= [COLOR=#b5cea8]0[COLOR=#b4b4b4]; [COLOR=#c8c8c8]i [COLOR=#b4b4b4]< [COLOR=#c8c8c8]numOfPackets[COLOR=#b4b4b4]; [COLOR=#c8c8c8]i[COLOR=#b4b4b4]++)    [COLOR=#b4b4b4]{        [COLOR=#57a64a]// Fill the buffer with the initial value        [COLOR=#c8c8c8]err [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clEnqueueFillBuffer[COLOR=#b4b4b4]([COLOR=#c8c8c8]command_queue[COLOR=#b4b4b4], [COLOR=#c8c8c8]devTestMem[COLOR=#b4b4b4][[COLOR=#c8c8c8]i[COLOR=#b4b4b4]], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]fillValue[COLOR=#b4b4b4], [COLOR=#569cd6]sizeof[COLOR=#b4b4b4]([COLOR=#4ec9b0]cl_int[COLOR=#b4b4b4]), [COLOR=#b5cea8]0[COLOR=#b4b4b4], [COLOR=#c8c8c8]packet_size [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024 [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024[COLOR=#b4b4b4], [COLOR=#b5cea8]0[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4]); 
        [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]!= [COLOR=#bd63c5]CL_SUCCESS[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error, could not fill buffer\n"[COLOR=#b4b4b4]);            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_COMMAND_QUEUE[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_COMMAND_QUEUE\n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_CONTEXT[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_CONTEXT\n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_MEM_OBJECT[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_MEM_OBJECT \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_VALUE[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_VALUE\n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_EVENT_WAIT_LIST[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_EVENT_WAIT_LIST \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_MISALIGNED_SUB_BUFFER_OFFSET[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_MISALIGNED_SUB_BUFFER_OFFSET \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_MEM_OBJECT_ALLOCATION_FAILURE[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_MEM_OBJECT_ALLOCATION_FAILURE \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_OUT_OF_RESOURCES[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_OUT_OF_RESOURCES \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_OUT_OF_HOST_MEMORY[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_OUT_OF_HOST_MEMORY \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]} 
            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error in allocation loop."[COLOR=#b4b4b4]); 
            [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];        [COLOR=#b4b4b4]} 
        [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"%u. packet allocated...\n"[COLOR=#b4b4b4], [COLOR=#c8c8c8]i [COLOR=#b4b4b4]+ [COLOR=#b5cea8]1[COLOR=#b4b4b4]);    [COLOR=#b4b4b4]} 
    [COLOR=#57a64a]// Division remainder    [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]numOfPackets [COLOR=#b4b4b4]* [COLOR=#c8c8c8]packet_size [COLOR=#b4b4b4]!= [COLOR=#c8c8c8]mem_size[COLOR=#b4b4b4])    [COLOR=#b4b4b4]{        [COLOR=#4ec9b0]size_t [COLOR=#c8c8c8]remainder_size [COLOR=#b4b4b4]= [COLOR=#c8c8c8]mem_size [COLOR=#b4b4b4]- [COLOR=#c8c8c8]numOfPackets [COLOR=#b4b4b4]* [COLOR=#c8c8c8]packet_size[COLOR=#b4b4b4]; 
        [COLOR=#c8c8c8]remainderMem [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clCreateBuffer[COLOR=#b4b4b4]([COLOR=#c8c8c8]context[COLOR=#b4b4b4], [COLOR=#bd63c5]CL_MEM_READ_WRITE[COLOR=#b4b4b4], [COLOR=#c8c8c8]remainder_size [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024 [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]err[COLOR=#b4b4b4]); 
        [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]!= [COLOR=#bd63c5]CL_SUCCESS[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error, could not allocate %u bytes.\n"[COLOR=#b4b4b4], [COLOR=#c8c8c8]remainder_size [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024 [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024[COLOR=#b4b4b4]);            [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];        [COLOR=#b4b4b4]} 
        [COLOR=#57a64a]// Fill the buffer with the initial value        [COLOR=#c8c8c8]err [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clEnqueueFillBuffer[COLOR=#b4b4b4]([COLOR=#c8c8c8]command_queue[COLOR=#b4b4b4], [COLOR=#c8c8c8]remainderMem[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]fillValue[COLOR=#b4b4b4], [COLOR=#569cd6]sizeof[COLOR=#b4b4b4]([COLOR=#4ec9b0]cl_int[COLOR=#b4b4b4]), [COLOR=#b5cea8]0[COLOR=#b4b4b4], [COLOR=#c8c8c8]remainder_size [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024 [COLOR=#b4b4b4]* [COLOR=#b5cea8]1024[COLOR=#b4b4b4], [COLOR=#b5cea8]0[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4]); 
        [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]!= [COLOR=#bd63c5]CL_SUCCESS[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error, could not fill buffer\n"[COLOR=#b4b4b4]);            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_COMMAND_QUEUE[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_COMMAND_QUEUE\n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_CONTEXT[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_CONTEXT\n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_MEM_OBJECT[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_MEM_OBJECT \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_VALUE[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_VALUE\n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_INVALID_EVENT_WAIT_LIST[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_INVALID_EVENT_WAIT_LIST \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_MISALIGNED_SUB_BUFFER_OFFSET[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_MISALIGNED_SUB_BUFFER_OFFSET \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_MEM_OBJECT_ALLOCATION_FAILURE[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_MEM_OBJECT_ALLOCATION_FAILURE \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_OUT_OF_RESOURCES[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_OUT_OF_RESOURCES \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]}            [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]err [COLOR=#b4b4b4]== [COLOR=#bd63c5]CL_OUT_OF_HOST_MEMORY[COLOR=#b4b4b4]) [COLOR=#b4b4b4]{ [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"CL_OUT_OF_HOST_MEMORY \n"[COLOR=#b4b4b4]); [COLOR=#b4b4b4]} 
            [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Error in allocation loop."[COLOR=#b4b4b4]); 
            [COLOR=#569cd6]return [COLOR=#bd63c5]EXIT_FAILURE[COLOR=#b4b4b4];        [COLOR=#b4b4b4]} 
        [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"%u MB remainder packet allocated...\n"[COLOR=#b4b4b4], [COLOR=#c8c8c8]remainder_size[COLOR=#b4b4b4]);    [COLOR=#b4b4b4]} 
    [COLOR=#c8c8c8]clFinish[COLOR=#b4b4b4]([COLOR=#c8c8c8]command_queue[COLOR=#b4b4b4]); 
    [COLOR=#57a64a]// wait for a key press    [COLOR=#c8c8c8]printf[COLOR=#b4b4b4]([COLOR=#d69d85]"Press return to exit and free memory...\n"[COLOR=#b4b4b4]);    [COLOR=#c8c8c8]getchar[COLOR=#b4b4b4](); 
    [COLOR=#57a64a]// free memory and exit    [COLOR=#c8c8c8]free[COLOR=#b4b4b4]([COLOR=#c8c8c8]platforms[COLOR=#b4b4b4]);    [COLOR=#569cd6]for [COLOR=#b4b4b4]([COLOR=#4ec9b0]size_t [COLOR=#c8c8c8]i [COLOR=#b4b4b4]= [COLOR=#b5cea8]0[COLOR=#b4b4b4]; [COLOR=#c8c8c8]i [COLOR=#b4b4b4]< [COLOR=#c8c8c8]numOfPackets[COLOR=#b4b4b4]; [COLOR=#c8c8c8]i[COLOR=#b4b4b4]++)    [COLOR=#b4b4b4]{        [COLOR=#c8c8c8]clReleaseMemObject[COLOR=#b4b4b4]([COLOR=#c8c8c8]devTestMem[COLOR=#b4b4b4][[COLOR=#c8c8c8]i[COLOR=#b4b4b4]]);    [COLOR=#b4b4b4]}    [COLOR=#c8c8c8]free[COLOR=#b4b4b4]([COLOR=#c8c8c8]devTestMem[COLOR=#b4b4b4]);    [COLOR=#569cd6]if [COLOR=#b4b4b4]([COLOR=#c8c8c8]remainderMem [COLOR=#b4b4b4]!= [COLOR=#bd63c5]NULL[COLOR=#b4b4b4])        [COLOR=#c8c8c8]clReleaseMemObject[COLOR=#b4b4b4]([COLOR=#c8c8c8]remainderMem[COLOR=#b4b4b4]);    [COLOR=#c8c8c8]clReleaseContext[COLOR=#b4b4b4]([COLOR=#c8c8c8]context[COLOR=#b4b4b4]);    [COLOR=#569cd6]return [COLOR=#b5cea8]0[COLOR=#b4b4b4];[COLOR=#b4b4b4]} 
[COLOR=#57a64a]// Programm ausführen: STRG+F5 oder "Debuggen" > Menü "Ohne Debuggen starten"[COLOR=#57a64a]// Programm debuggen: F5 oder "Debuggen" > Menü "Debuggen starten" 
[COLOR=#57a64a]// Tipps für den Einstieg: [COLOR=#57a64a]//   1. Verwenden Sie das Projektmappen-Explorer-Fenster zum Hinzufügen/Verwalten von Dateien.[COLOR=#57a64a]//   2. Verwenden Sie das Team Explorer-Fenster zum Herstellen einer Verbindung mit der Quellcodeverwaltung.[COLOR=#57a64a]//   3. Verwenden Sie das Ausgabefenster, um die Buildausgabe und andere Nachrichten anzuzeigen.[COLOR=#57a64a]//   4. Verwenden Sie das Fenster "Fehlerliste", um Fehler anzuzeigen.[COLOR=#57a64a]//   5. Wechseln Sie zu "Projekt" > "Neues Element hinzufügen", um neue Codedateien zu erstellen, bzw. zu "Projekt" > "Vorhandenes Element hinzufügen", um dem Projekt vorhandene Codedateien hinzuzufügen.[COLOR=#57a64a]//   6. Um dieses Projekt später erneut zu öffnen, wechseln Sie zu "Datei" > "Öffnen" > "Projekt", und wählen Sie die SLN-Datei aus.
 

Anhänge

  • OpenCLVRAMAllocator.zip
    172,4 KB · Aufrufe: 9
Zuletzt bearbeitet von einem Moderator:
OpenGL geht auf meiner Nvidia mit 10.000 getestet.
OpenCL geht auch auf meiner Nvidia mit 10.000 getestet.

Wundervoll.
Bin gespannt ob es auch bei der roten Jüngern funktioniert, und dann könnte ich es im Startpost verlinken.
 
Habe nun getestet mit Werten von 3000 bis 4200 in 100er Schritten. Bis 3500 einschließlich funktionert es. Ab 3600 nicht mehr.
 
@Sequence.Buffer(k).Select(subSeq => subSeq.First()): Du machst die ganze Stimmung kaputt. ^^

Edit: Auf der Seven 12 GB alloziert...
Edit2: Auf dem System mit der 1080 Ti bekomme ich einen Platform Error.
 

Anhänge

  • OpenCL_Allocator_Seven.png
    OpenCL_Allocator_Seven.png
    95,6 KB · Aufrufe: 27
Zuletzt bearbeitet von einem Moderator:
Der Platform Error auf dem 1080 Ti System kam daher, dass der Radeon Adrenalin Treiber noch installiert war, die Karte aber bereits im Zweitrechner verbaut ist. Dürfte im Allgemeinen nicht so oft auftauchen der Fehler... ^^

@Downsampler: Wenn du 3500 MB bei einer Vega mit 8GB Speicher abknappsen kannst, ist das doch ausreichend oder nicht?
 
Ja wieso denn? Was, wenn ich eine 1 GB oder 2 GB Karte simulieren will oder sogar eine mit noch weniger VRAM?

So kann ich ja bloß eine 4,5 GB oder größere Grafikkarte simulieren. :(

Für eure Forschung zwecks 4 bzw. 6 GB vs 8+ GB reicht das aus.

Hab jetzt meine Entwicklungsumgebung installiert in meiner Windows 10 LTSC Test-VM und angefangen das Programm in C++ zu coden. :)
 
Zuletzt bearbeitet:
@Downsampler: Wenn du das debuggst, was kommt dann bei der Zeile
Code:
[COLOR=#57a64a]// query the number of platforms[COLOR=#c8c8c8]
err [COLOR=#b4b4b4]= [COLOR=#c8c8c8]clGetPlatformIDs[COLOR=#b4b4b4]([COLOR=#b5cea8]0[COLOR=#b4b4b4], [COLOR=#bd63c5]NULL[COLOR=#b4b4b4], [COLOR=#b4b4b4]&[COLOR=#c8c8c8]numPlatforms[COLOR=#b4b4b4]);[COLOR=#b4b4b4]

raus? Welchen Wert hat numPlatforms?
 
Es ist dein Programm und es ist in C. Ich ziehe das ganz von vorne auf mit C++.

Da es "&numPlatforms" ist, steht dort die Speicheradresse von "numPlatforms" in Hexadezimal.

Außerdem hast du "numPlatforms" bei der Initialisierung mit 0 deklariert.
 
Zuletzt bearbeitet:
Ich kann wohl in der VM den Code nich Compilieren, weil dort keine gültige Platform erkannt wird. Das stopt den Linker in seiner Arbeit.

Ich dreh hier noch durch.... xD

Edit: Okay hat sich erledigt durch das hinzufügen der OpenCL.lib Datei....
 
Solche Probleme machen sich erst zur Laufzeit bemerkbar.

Edit: Ja, die OpenCL.lib braucht man zum Kompilieren.

Na das hinzufügen hab ich ganz am Anfang gemacht, sonst erhält man dauernd Fehlermeldungen beim Coden und Debuggen. Hat es zwischendrin nach ein paar Stunden Mengen einfach mal so vergessen, das Visual Studio.

Naja jetzt klappt alles wieder. Compiliert Debug und Release x64 ohne Fehler. Ca. 1/3 der Arbeit ist fertig.

Hoffentlich hab ich mit dem letzten Statement nicht gelogen. :ugly:
 
DX12 scheint geschickter mit den Ressourcen umzugehen.

24GB-Graka
TheDivision2_24GB.jpg
16GB-Graka
TheDivision2_16GB.jpg
12GB-GRaka
TheDivision2_12GB.jpg
11GB-Graka
TheDivision2_11GB.jpg
8GB-Graka
TheDivision2_8GB.jpg
6GB-Graka
TheDivision2_6GB.jpg
 
Zurück