Z czego nauczyć się używać OpenCL?

Z czego nauczyć się używać OpenCL?
L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

Kiedy instalowałem to wszystko i dalej nic :/
powinno mi wyświetlić procesor w liście dostępnych urządzeń a tutaj nic :/

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Poproś o pomoc kolegów albo wykładowcę/ ćwiczeniowca. Ewentualnie wypożycz sprzęt, który ma odpowiednie możliwości.

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

Spróbuję jeszcze z Emulatorem openCL. Czy ktokolwiek go instalował? Spojżałem na instrukcje jak to zrobić i niestety nie rozumiem tego.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Czego dokładnie nie rozumiesz?

Instrukcje masz tutaj: http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-emulator-debugger/
Krok 1: Zainstaluj AMD APP SDK - udało ci się?

Zresztą nie widzę sensu instalowania tego emulatora-debuggera. Jeśli uda ci się zainstalować AMD APP SDK to masz obsługę OpenCL na CPU i możesz zacząć działać z OpenCLem.

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

sdk właśnie instaluję
ale resztę instrukcji średnio rozumiem

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

To zainstaluj SDK i będziesz miał obsługę OpenCL dla CPU. Nie wiem ile razy to powtarzać. Ten emulator-debugger służy chyba do tego, by móc pisać kernele w C++ i mieć wsparcie od Visual Studio dla podpowiadania składni. Emulator-debugger potem chyba jakoś tłumaczy ten C++ na OpenCLa i wrzuca do sterownika OpenCL. Nie wiem dokładnie. Olej to i skup się na zainstalowaniu SDK tak by mieć obsługę OpenCL na CPU.

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

niestety nic to nie dało.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Co to znaczy "nic to nie dało"?

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

zainstalowałem SDK i odpaliłem 2 projekty, najpierw ten przytoczony przeze mnie kilka postów wcześniej, napis był dokładnie ten sam potem odpaliłem dla pewności kolejny projekt z tego samego tutorialu i niestety ale w trakcie działania programu był błąd

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

No to może sterowniki ci się gryzą. Odinstaluj wszystko od AMD, nVidii i Intela, a potem zainstaluj AMD APP SDK ponownie. I nie zapomnij o restarcie konsoli chociażby (a może nawet i systemu całego?).

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

jeżeli chciałbym to zrobić szybciej by wyszło reinstalacja systemu a na to nie mam czasu :/ projekt mam oddać w ten czwartek

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

A zgłaszałeś swój problem komukolwiek innemu niż anonimowym ludziom w Internecie?

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

problem zauwazyłem jak tutaj temat utworzyłem, nikomu innemu o nim nie mówiłem

LI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 518
1

Zrób sobie herbatę, zjedz czekoladę, sprawdź kiedy wykładowca ma konsultacje może akurat dziś? A jak nie, może ma jakieś zajęcia? Może możesz podejść i zagadać? Maila wyślij prowadzącemu z opisem problemu. Przejdź się na wydział tam na pewno(raczej) to działa i ominiesz tą konfiguracje.

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
1

Tu masz tutorial: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/OpenCL-Emu-Documentation-2.pdf

Jeśli chcesz jakiejś konkretniejszej pomocy to:
a) musiałbyś komuś sporo zapłacić lub
b) bądź bardziej konkretny w opisach błędów, za "niestety nic to nie dało" wątek powinien polecieć do kosza

Co pokazuje "OpenCL Device Query" ze strony https://developer.nvidia.com/opencl ?
Wrzuć tutaj.

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

Wynik programu "OpenCL Device Query"

Kopiuj
C:\Users\Lordzik\Desktop\oclDeviceQuery\NVIDIA GPU Computing SDK\OpenCL\bin\win64\Debug\oclDeviceQuery.exe Starting...

OpenCL SW Info:

WARNING: NVIDIA OpenCL platform not found - defaulting to first platform!

 CL_PLATFORM_NAME: 	Intel(R) OpenCL
 CL_PLATFORM_VERSION: 	OpenCL 1.2 
 OpenCL SDK Revision: 	7027912


OpenCL Device Info:

 1 devices found supporting OpenCL:

 ---------------------------------
 Device Intel(R) Core(TM) i5 CPU       M 430  @ 2.27GHz
 ---------------------------------
  CL_DEVICE_NAME: 			Intel(R) Core(TM) i5 CPU       M 430  @ 2.27GHz
  CL_DEVICE_VENDOR: 			Intel(R) Corporation
  CL_DRIVER_VERSION: 			5.0.0.57
  CL_DEVICE_VERSION: 			OpenCL 1.2 (Build 57)
  CL_DEVICE_OPENCL_C_VERSION: 		OpenCL C 1.2 
  CL_DEVICE_TYPE:			CL_DEVICE_TYPE_CPU
  CL_DEVICE_MAX_COMPUTE_UNITS:		4
  CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS:	3
  CL_DEVICE_MAX_WORK_ITEM_SIZES:	8192 / 8192 / 8192 
  CL_DEVICE_MAX_WORK_GROUP_SIZE:	8192
  CL_DEVICE_MAX_CLOCK_FREQUENCY:	2270 MHz
  CL_DEVICE_ADDRESS_BITS:		64
  CL_DEVICE_MAX_MEM_ALLOC_SIZE:		941 MByte
  CL_DEVICE_GLOBAL_MEM_SIZE:		3766 MByte
  CL_DEVICE_ERROR_CORRECTION_SUPPORT:	no
  CL_DEVICE_LOCAL_MEM_TYPE:		global
  CL_DEVICE_LOCAL_MEM_SIZE:		32 KByte
  CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:	128 KByte
  CL_DEVICE_QUEUE_PROPERTIES:		CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
  CL_DEVICE_QUEUE_PROPERTIES:		CL_QUEUE_PROFILING_ENABLE
  CL_DEVICE_IMAGE_SUPPORT:		1
  CL_DEVICE_MAX_READ_IMAGE_ARGS:	480
  CL_DEVICE_MAX_WRITE_IMAGE_ARGS:	480
  CL_DEVICE_SINGLE_FP_CONFIG:		denorms INF-quietNaNs round-to-nearest 

  CL_DEVICE_IMAGE <dim>			2D_MAX_WIDTH	 16384
					2D_MAX_HEIGHT	 16384
					3D_MAX_WIDTH	 2048
					3D_MAX_HEIGHT	 2048
					3D_MAX_DEPTH	 2048

  CL_DEVICE_EXTENSIONS:			cl_khr_icd
					cl_khr_global_int32_base_atomics
					cl_khr_global_int32_extended_atomics
					cl_khr_local_int32_base_atomics
					cl_khr_local_int32_extended_atomics
					cl_khr_byte_addressable_store
					cl_khr_depth_images
					cl_khr_3d_image_writes
					cl_intel_exec_by_local_thread
					cl_khr_spir
					cl_khr_fp64

  CL_DEVICE_PREFERRED_VECTOR_WIDTH_<t>	CHAR 1, SHORT 1, INT 1, LONG 1, FLOAT 1, DOUBLE 1


  ---------------------------------
  2D Image Formats Supported (53)
  ---------------------------------
  #     Channel Order   Channel Type          

  1     CL_RGBA         CL_UNORM_INT8         
  2     CL_RGBA         CL_UNORM_INT16        
  3     CL_RGBA         CL_SNORM_INT8         
  4     CL_RGBA         CL_SNORM_INT16        
  5     CL_RGBA         CL_SIGNED_INT8        
  6     CL_RGBA         CL_SIGNED_INT16       
  7     CL_RGBA         CL_SIGNED_INT32       
  8     CL_RGBA         CL_UNSIGNED_INT8      
  9     CL_RGBA         CL_UNSIGNED_INT16     
  10    CL_RGBA         CL_UNSIGNED_INT32     
  11    CL_RGBA         CL_HALF_FLOAT         
  12    CL_RGBA         CL_FLOAT              
  13    CL_BGRA         CL_UNORM_INT8         
  14    CL_INTENSITY    CL_FLOAT              
  15    CL_INTENSITY    CL_UNORM_INT8         
  16    CL_INTENSITY    CL_UNORM_INT16        
  17    CL_INTENSITY    CL_HALF_FLOAT         
  18    CL_LUMINANCE    CL_FLOAT              
  19    CL_LUMINANCE    CL_UNORM_INT8         
  20    CL_LUMINANCE    CL_UNORM_INT16        
  21    CL_LUMINANCE    CL_HALF_FLOAT         
  22    CL_R            CL_FLOAT              
  23    CL_R            CL_UNORM_INT8         
  24    CL_R            CL_UNORM_INT16        
  25    CL_R            CL_SNORM_INT8         
  26    CL_R            CL_SNORM_INT16        
  27    CL_R            CL_SIGNED_INT8        
  28    CL_R            CL_SIGNED_INT16       
  29    CL_R            CL_SIGNED_INT32       
  30    CL_R            CL_UNSIGNED_INT8      
  31    CL_R            CL_UNSIGNED_INT16     
  32    CL_R            CL_UNSIGNED_INT32     
  33    CL_R            CL_HALF_FLOAT         
  34    CL_A            CL_UNORM_INT8         
  35    CL_A            CL_UNORM_INT16        
  36    CL_A            CL_HALF_FLOAT         
  37    CL_A            CL_FLOAT              
  38    CL_RG           CL_UNORM_INT8         
  39    CL_RG           CL_UNORM_INT16        
  40    CL_RG           CL_SNORM_INT8         
  41    CL_RG           CL_SNORM_INT16        
  42    CL_RG           CL_SIGNED_INT16       
  43    CL_RG           CL_SIGNED_INT32       
  44    CL_RG           CL_SIGNED_INT8        
  45    CL_RG           CL_UNSIGNED_INT8      
  46    CL_RG           CL_UNSIGNED_INT16     
  47    CL_RG           CL_UNSIGNED_INT32     
  48    CL_RG           CL_HALF_FLOAT         
  49    CL_RG           CL_FLOAT              
  50    Unknown         CL_UNORM_INT8         
  51    Unknown         CL_UNORM_INT8         
  52    Unknown         CL_FLOAT              
  53    Unknown         CL_UNORM_INT16        

  ---------------------------------
  3D Image Formats Supported (51)
  ---------------------------------
  #     Channel Order   Channel Type          

  1     CL_RGBA         CL_UNORM_INT8         
  2     CL_RGBA         CL_UNORM_INT16        
  3     CL_RGBA         CL_SNORM_INT8         
  4     CL_RGBA         CL_SNORM_INT16        
  5     CL_RGBA         CL_SIGNED_INT8        
  6     CL_RGBA         CL_SIGNED_INT16       
  7     CL_RGBA         CL_SIGNED_INT32       
  8     CL_RGBA         CL_UNSIGNED_INT8      
  9     CL_RGBA         CL_UNSIGNED_INT16     
  10    CL_RGBA         CL_UNSIGNED_INT32     
  11    CL_RGBA         CL_HALF_FLOAT         
  12    CL_RGBA         CL_FLOAT              
  13    CL_BGRA         CL_UNORM_INT8         
  14    CL_INTENSITY    CL_FLOAT              
  15    CL_INTENSITY    CL_UNORM_INT8         
  16    CL_INTENSITY    CL_UNORM_INT16        
  17    CL_INTENSITY    CL_HALF_FLOAT         
  18    CL_LUMINANCE    CL_FLOAT              
  19    CL_LUMINANCE    CL_UNORM_INT8         
  20    CL_LUMINANCE    CL_UNORM_INT16        
  21    CL_LUMINANCE    CL_HALF_FLOAT         
  22    CL_R            CL_FLOAT              
  23    CL_R            CL_UNORM_INT8         
  24    CL_R            CL_UNORM_INT16        
  25    CL_R            CL_SNORM_INT8         
  26    CL_R            CL_SNORM_INT16        
  27    CL_R            CL_SIGNED_INT8        
  28    CL_R            CL_SIGNED_INT16       
  29    CL_R            CL_SIGNED_INT32       
  30    CL_R            CL_UNSIGNED_INT8      
  31    CL_R            CL_UNSIGNED_INT16     
  32    CL_R            CL_UNSIGNED_INT32     
  33    CL_R            CL_HALF_FLOAT         
  34    CL_A            CL_UNORM_INT8         
  35    CL_A            CL_UNORM_INT16        
  36    CL_A            CL_HALF_FLOAT         
  37    CL_A            CL_FLOAT              
  38    CL_RG           CL_UNORM_INT8         
  39    CL_RG           CL_UNORM_INT16        
  40    CL_RG           CL_SNORM_INT8         
  41    CL_RG           CL_SNORM_INT16        
  42    CL_RG           CL_SIGNED_INT16       
  43    CL_RG           CL_SIGNED_INT32       
  44    CL_RG           CL_SIGNED_INT8        
  45    CL_RG           CL_UNSIGNED_INT8      
  46    CL_RG           CL_UNSIGNED_INT16     
  47    CL_RG           CL_UNSIGNED_INT32     
  48    CL_RG           CL_HALF_FLOAT         
  49    CL_RG           CL_FLOAT              
  50    Unknown         CL_UNORM_INT8         
  51    Unknown         CL_UNORM_INT8         

oclDeviceQuery, Platform Name = Intel(R) OpenCL, Platform Version = OpenCL 1.2 , SDK Revision = 7027912, NumDevs = 1, Device = Intel(R) Core(TM) i5 CPU       M 430  @ 2.27GHz

System Info: 

 Local Time/Date = 10:17:22, 5/27/2015
 CPU Arch: 9
 CPU Level: 6
 # of CPU processors: 4
 Windows Build: 7601
 Windows Ver: 6.1 (Windows Vista / Windows 7)

Natomiast program ze strony:
https://holisz.pl/opencl-tutorial-czesc-2-listowanie-dostepnych-urzadzen/
daje taki wynik:
https://onedrive.live.com/redir?resid=35c2a5b0aaf9523b!1512&authkey=!AKKko8yRyTtsMPs&v=3&ithint=photo%2cjpg

A program ze strony:
https://holisz.pl/opencl-tutorial-czesc-3-sumowanie-wektorow/
Działa tak:
https://onedrive.live.com/redir?resid=35c2a5b0aaf9523b!1514&authkey=!ANMjucVC4QcMS2k&v=3&ithint=photo%2cjpg

zamiana znacznika <quote> na <code class="none"> - @furious programming

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

Dziękuję vPiotr
Teraz już wiem dlaczego nie znajdowało mi wszystkich urządzeń, w funkcji clGetDeviceIDs jako parametr device_type miałem podany CL_DEVICE_TYPE_GPU a wystarczyło zamienić na CL_DEVICE_TYPE_CPU.
Tak mało, a tak obszerny temat powstał.

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

Kolejny problem się pojawił. Związany już z samym programem, a mianowicie muszę wykonać sumowanie co czwartego elementu i program nie wykonuje tego poprawnie.
poniżej kernel odpowiedzialny za to:

Kopiuj
 __kernel void Add(__global int* a, __global int* d, int size)
{
    
    int n = get_global_id(0);

    
    if (n < size )
    {   
		switch (n % 4){
		case 0: d[0] += a[n];
			break;
		case 1: d[1] += a[n];
			break;
		case 2: d[2] += a[n];
			break;
		case 3: d[3] += a[n];
			break;
		}
		
    }
}

A oto kod zawarty w pliku main.cpp

Kopiuj
#include <iostream>
#include <fstream>
#include <string>

#include <CL/cl.h>

void randomizeArray(cl_int* data, size_t vectorSize)
{
    for (size_t i = 0; i < vectorSize; ++i) 
    {
        data[i] = rand() % 10;
    }
}

void zeroArray(cl_int* data, size_t vectorSize)
{
	for (size_t i = 0; i < vectorSize; ++i)
	{
		data[i] = 0;
	}
}

int main()
{
    cl_int error = CL_SUCCESS;

    // Numer Platformy.
    cl_uint platformNumber = 0;

    error = clGetPlatformIDs(0, NULL, &platformNumber);

    if (0 == platformNumber)
    {
        std::cout << "No OpenCL platforms found." << std::endl;

        return 0;
    }

    // Identyfikator platformy.
    cl_platform_id* platformIds = new cl_platform_id[platformNumber];

    error = clGetPlatformIDs(platformNumber, platformIds, NULL);

    // Informacje o platformie.
    for (cl_uint i = 0; i < platformNumber; ++i)
    {
        char name[1024] = { '\0' };

        std::cout << "Platform:\t" << i << std::endl;

        error = clGetPlatformInfo(platformIds[i], CL_PLATFORM_NAME, 1024, &name, NULL);

        std::cout << "Name:\t\t" << name << std::endl;

        error = clGetPlatformInfo(platformIds[i], CL_PLATFORM_VENDOR, 1024, &name, NULL);

        std::cout << "Vendor:\t\t" << name << std::endl;

        std::cout << std::endl;
    }

    // Numer urządzenia.
    cl_uint deviceNumber;

    error = clGetDeviceIDs(platformIds[0], CL_DEVICE_TYPE_DEFAULT, 0, NULL, &deviceNumber);

    if (0 == deviceNumber)
    {
        std::cout << "No OpenCL devices found on platform " << 1 << "." << std::endl;
    }

    // Identyfikator urządzenia.
    cl_device_id* deviceIds = new cl_device_id[deviceNumber];

	error = clGetDeviceIDs(platformIds[0], CL_DEVICE_TYPE_DEFAULT, deviceNumber, deviceIds, &deviceNumber);

    // informacje o urządzeniu.
    for (cl_uint i = 0; i < deviceNumber; ++i)
    {
        char name[1024] = { '\0' };

        std::cout << "Device:\t\t" << i << std::endl;

        error = clGetDeviceInfo(deviceIds[i], CL_DEVICE_NAME, 1024, &name, NULL);

        std::cout << "Name:\t\t" << name << std::endl;

        error = clGetDeviceInfo(deviceIds[i], CL_DEVICE_VENDOR, 1024, &name, NULL);

        std::cout << "Vendor:\t\t" << name << std::endl;

        error = clGetDeviceInfo(deviceIds[i], CL_DEVICE_VERSION, 1024, &name, NULL);

        std::cout << "Version:\t" << name << std::endl;
    }

    std::cout << std::endl;

    // Alokacja pamięci dla  tablic
    size_t vectorSize = 32;
    size_t localWorkSize = 8;

    cl_int* a = new cl_int[vectorSize];
    cl_int* b = new cl_int[vectorSize];
    cl_int* c = new cl_int[vectorSize];
	cl_int* d = new cl_int[4];

    randomizeArray(a, vectorSize);
    randomizeArray(b, vectorSize);
	zeroArray(c, vectorSize);
	zeroArray(d, 4);

    // Utworzenie kontekstu OpenCL. Um ożliwia on wykonywanie poleceń na zadanym urządzeniu.
    cl_context context = clCreateContext(0, deviceNumber, deviceIds, NULL, NULL, NULL);

    if (NULL == context)
    {
        std::cout << "Failed to create OpenCL context." << std::endl;
    }

    // Utworzenie kolejki poleceń na wybranym urządzeniu.
    cl_command_queue commandQueue = clCreateCommandQueue(context, deviceIds[0], 0, &error);

    // Allokowanie pamięci dla naszych wektorów na urządzeniu na którym będziemy pracować.
    cl_mem bufferA = clCreateBuffer(context, CL_MEM_READ_ONLY , sizeof(cl_int) * vectorSize, NULL, &error);
    cl_mem bufferB = clCreateBuffer(context, CL_MEM_READ_ONLY , sizeof(cl_int) * vectorSize, NULL, &error);
    cl_mem bufferC = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_int) * vectorSize, NULL, &error);
	cl_mem bufferD = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_int) * 4, NULL, &error);

    // Wczytywanie kodu programu z pliku, ładowanie do rządzenia i kompilacja.
//Program Cmp
	std::ifstream file1(".\\bin\\Cmp.cl", std::ifstream::in);
    std::string str1;

	file1.seekg(0, std::ios::end);
	size_t programSize1 = (size_t)file1.tellg();

	str1.reserve((unsigned int)file1.tellg());
	file1.seekg(0, std::ios::beg);

	str1.assign(std::istreambuf_iterator<char>(file1), std::istreambuf_iterator<char>());
	const char* source1 = str1.c_str();

	// Kompilacja.
	cl_program program1 = clCreateProgramWithSource(context, 1, &source1, &programSize1, &error);

	error = clBuildProgram(program1, 0, NULL, NULL, NULL, NULL);

	// Utworzenie kernela.
	cl_kernel kernel1 = clCreateKernel(program1, "Cmp", &error);

//Program Add
	std::ifstream file2(".\\bin\\Add.cl", std::ifstream::in);
	std::string str2;

	file2.seekg(0, std::ios::end);
	size_t programSize2 = (size_t)file2.tellg();
    
	str2.reserve((unsigned int)file2.tellg());
	file2.seekg(0, std::ios::beg);    
 
	str2.assign(std::istreambuf_iterator<char>(file2), std::istreambuf_iterator<char>());
	const char* source2 = str2.c_str();

    // Kompilacja.
   	cl_program program2 = clCreateProgramWithSource(context, 1, &source2, &programSize2, &error);
    
	error = clBuildProgram(program2, 0, NULL, NULL, NULL, NULL); 

    // Utworzenie kernela.
    cl_kernel kernel2 = clCreateKernel(program2, "Add", &error);

// Kernel 1
    // Ustawienie wartości argumentów.
    error = clSetKernelArg(kernel1, 0, sizeof(cl_mem), (void*)&bufferA);
    error = clSetKernelArg(kernel1, 1, sizeof(cl_mem), (void*)&bufferB);
    error = clSetKernelArg(kernel1, 2, sizeof(cl_mem), (void*)&bufferC);
    error = clSetKernelArg(kernel1, 3, sizeof(cl_int), (void*)&vectorSize);

    // Asynchroniczny zapis danych do urządzenia.
    error = clEnqueueWriteBuffer(commandQueue, bufferA, CL_FALSE, 0, sizeof(cl_int) * vectorSize, a, 0, NULL, NULL);
    error = clEnqueueWriteBuffer(commandQueue, bufferB, CL_FALSE, 0, sizeof(cl_int) * vectorSize, b, 0, NULL, NULL);

    // Uruchomienie kernela.
    error = clEnqueueNDRangeKernel(commandQueue, kernel1, 1, NULL, &vectorSize, &localWorkSize, 0, NULL, NULL);

    // Wczytanie danych wynikowych.
    error = clEnqueueReadBuffer(commandQueue, bufferC, CL_TRUE, 0, sizeof(cl_int) * vectorSize, c, 0, NULL, NULL);

// Kernel 2
	// Ustawienie wartości argumentów.
	error = clSetKernelArg(kernel2, 0, sizeof(cl_mem), (void*)&bufferA);
	error = clSetKernelArg(kernel2, 2, sizeof(cl_mem), (void*)&bufferD);
	error = clSetKernelArg(kernel2, 3, sizeof(cl_int), (void*)&vectorSize);

	// Asynchroniczny zapis danych do urządzenia.
	error = clEnqueueWriteBuffer(commandQueue, bufferA, CL_FALSE, 0, sizeof(cl_int)* vectorSize, c, 0, NULL, NULL);

	// Uruchomienie kernela.
	error = clEnqueueNDRangeKernel(commandQueue, kernel2, 1, NULL, &vectorSize, &localWorkSize, 0, NULL, NULL);

	// Wczytanie danych wynikowych.
	error = clEnqueueReadBuffer(commandQueue, bufferD, CL_TRUE, 0, sizeof(cl_int)* 4, d, 0, NULL, NULL);
    
	//Wypisanie wyniku.
    for (size_t i = 0; i < 4; ++i)
    {
        std::cout << d[i] << std::endl;
    }
	for (size_t i = 0; i < vectorSize; ++i)
	{
		std::cout << a[i] << "\t" << b[i] << "\t" << c[i] << std::endl;
	}

    // Czyszczenie i zwalnianie pamięci.
    clFlush(commandQueue);
    clFinish(commandQueue);
    clReleaseKernel(kernel1);
    clReleaseProgram(program1);
	clReleaseKernel(kernel2);
	clReleaseProgram(program2);
    clReleaseMemObject(bufferA);
    clReleaseMemObject(bufferB);
    clReleaseMemObject(bufferC);
	clReleaseMemObject(bufferD);
    clReleaseCommandQueue(commandQueue);
    clReleaseContext(context);

    delete[] a;
    delete[] b;
    delete[] c;
	delete[] d;

    delete[] platformIds;
    delete[] deviceIds;

    // Wciśnij Enter by zakończyć.
    std::cin.get();

    return 0;
}
 

Oto wynik działania programu:
https://onedrive.live.com/redir?resid=35c2a5b0aaf9523b!1515&authkey=!ALpC6XjKEoRgF1c&v=3&ithint=photo%2cjpg

Gdzie:

  • na górze opis platformy i sprzętu
  • pierwsze 4 liczby miały być to sumy elementów z trzeciej kolumny pod nimi, dla których reszta dzielenia ich położenia w tabeli przez 4 odpowiada kolejno 0, 1, 2, 3
  • 3 kolumny na dole to tablica a, b i c gdzie a to tablica wzorcowa, b to tablica którą porównujemy a c zawiera wynik porónania (1 jeżeli liczby są równe, 0 gdy nie)

Czy może ktoś mi z tym pomóc?

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
1
Kopiuj
    error = clSetKernelArg(kernel2, 0, sizeof(cl_mem), (void*)&bufferA);
    error = clSetKernelArg(kernel2, 2, sizeof(cl_mem), (void*)&bufferD);
    error = clSetKernelArg(kernel2, 3, sizeof(cl_int), (void*)&vectorSize);

Indeksy mają być 0, 1, 2, a nie 0, 2, 3.

Kopiuj
 __kernel void Add(__global int* a, __global int* d, int size)
{
 
    int n = get_global_id(0);
 
 
    if (n < size )
    {   
        switch (n % 4){
        case 0: d[0] += a[n];
            break;
        case 1: d[1] += a[n];
            break;
        case 2: d[2] += a[n];
            break;
        case 3: d[3] += a[n];
            break;
        }
 
    }
}

Pamiętaj, że to będzie odpalane w wielu wątkach. Operowanie z wielu wątków na tej samej zmiennej bez synchronizacji może prowadzić do błędnych wyników.
Rozwiązaniem są:

  1. Sumowanie hierarchiczne, które ja opisałem - wtedy każdy work-item operuje sobie na swoim kawałku danych i nie trzeba nic synchronizować,
    lub
  2. Wykorzystanie atomics: https://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/atomic_add.html
L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

Nie za bardzo wiem jak zrobić to sumowanie hierarchiczne. Rozumiem idee ale w praktyce nie umiem tego zrobić. Pierwszy raz programuję w OpenCL.

Jak użyć tego atomics? Może pytanie głupie, ale niestety jeszcze nie umiem w pełni języka angielskiego i często się gubię tak jak w tym wypadku.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Tak samo jak funkcji w C.

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

To znaczy?
Nie wiem jak to zaimplementować. Mógłbyś opisać to jak krok po kroku to wykonać, ale tym razem już od strony praktycznej nie teoretycznej.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Zamiast:

Kopiuj
a[i] += x;

użyj:

Kopiuj
atomic_add(a + i, x);
L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

czyli w moim programie to będzie:

Kopiuj
 atomic_add(d,a[n]) lub
atomic_add(d+1,a[n]) lub 
atomic_add(d+2,a[n]) lub
atomic_add(d+3,a[n])

??

Lecz gdy to uczyniłem to rezultat działania programu nie zmienił się.

Kopiuj
 
__kernel void Add(__global int* a, __global int* d, int size)
{
    
    int n = get_global_id(0);

    
    if (n < size )
    {   
		switch (n % 4){
		case 0: atomic_add(d, a[n]);
			break;
		case 1: atomic_add(d + 1, a[n]);
			break;
		case 2: atomic_add(d + 2, a[n]);
			break;
		case 3: atomic_add(d + 3, a[n]);
			break;
		}
		
    }
}
Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Kod wygląda OK.

Indeksy argumentów poprawiłeś?

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0
Kopiuj
  error = clSetKernelArg(kernel2, 0, sizeof(cl_mem), (void*)&bufferA);
    error = clSetKernelArg(kernel2, 1, sizeof(cl_mem), (void*)&bufferD);
    error = clSetKernelArg(kernel2, 2, sizeof(cl_int), (void*)&vectorSize);

o tym mowa?

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Tak.

L9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 39
0

poprawione było gdy uruchamiałem program.
To może powiesz jak zrobić to zliczanie hierarchiczne?

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

A działa ci już dobrze?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.