Kiedy instalowałem to wszystko i dalej nic :/
powinno mi wyświetlić procesor w liście dostępnych urządzeń a tutaj nic :/
Z czego nauczyć się używać OpenCL?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Poproś o pomoc kolegów albo wykładowcę/ ćwiczeniowca. Ewentualnie wypożycz sprzęt, który ma odpowiednie możliwości.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
Spróbuję jeszcze z Emulatorem openCL. Czy ktokolwiek go instalował? Spojżałem na instrukcje jak to zrobić i niestety nie rozumiem tego.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
sdk właśnie instaluję
ale resztę instrukcji średnio rozumiem
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Co to znaczy "nic to nie dało"?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
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
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
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?).
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
jeżeli chciałbym to zrobić szybciej by wyszło reinstalacja systemu a na to nie mam czasu :/ projekt mam oddać w ten czwartek
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
A zgłaszałeś swój problem komukolwiek innemu niż anonimowym ludziom w Internecie?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
problem zauwazyłem jak tutaj temat utworzyłem, nikomu innemu o nim nie mówiłem
- Rejestracja: dni
- Ostatnio: dni
- Postów: 518
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
Wynik programu "OpenCL Device Query"
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
- Rejestracja: dni
- Ostatnio: dni
Czyli masz OpenCL, musisz tylko dobrze wybrać urządzenie.
https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetDeviceIDs.html
https://developer.apple.com/library/mac/technotes/tn2335/_index.html
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
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ł.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
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:
__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
#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
4odpowiada kolejno0, 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 (
1jeżeli liczby są równe,0gdy nie)
Czy może ktoś mi z tym pomóc?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
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.
__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ą:
- 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 - Wykorzystanie atomics: https://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/atomic_add.html
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Tak samo jak funkcji w C.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
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.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Zamiast:
a[i] += x;
użyj:
atomic_add(a + i, x);
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
czyli w moim programie to będzie:
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ę.
__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;
}
}
}
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Kod wygląda OK.
Indeksy argumentów poprawiłeś?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
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?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
Tak.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 39
poprawione było gdy uruchamiałem program.
To może powiesz jak zrobić to zliczanie hierarchiczne?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: XML Hills
A działa ci już dobrze?