Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.83
Forester04
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 24
#1

Программа в OpenCL - C++

30.07.2010, 14:06. Просмотров 5297. Ответов 10
Метки нет (Все метки)

Братцы, сроки поджимают и нужно закончить программульку одну.

В общем, делал-делал и пришёл я к тупику на данном этапе... не знаю, что и делать.
Изначально программа должна была высчитывать с помощью ЦПУ корень из числа.
На выходе получается большое отрицательное число.
Помогите пожалуйста исправить ошибки.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdafx.h>
#include <CL/cl.h>
 
 
const char* OpenCLSource[] =  {"__kernel void kor (__global float* X, __global float* SM,__global float* rez)"
"{"
"X = 10000;"
"if (X > 1) SM = X / 2; else SM  = 1;"
"for(; (SM != 0); SM /= 2) if ((rez * rez) > X) rez -= SM; else rez += SM;"
"return(rez);"
"}"
};
 
 
int main(int argc, char **argv) 
 
{
 
float X;
float SM;
float rez;
 
 
//Инициализация устройства
cl_context cxGPUContext = clCreateContextFromType(NULL, CL_DEVICE_TYPE_CPU, NULL, NULL, NULL);  
 
 
cl_int cdDevice = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_CPU, NULL, NULL, NULL);
 
//Очерёдность выполнения
cl_command_queue cqCommandQue = clCreateCommandQueue(cl_context (cxGPUContext), NULL, 0, NULL);
//Memory Objects
cl_mem Xq = clCreateBuffer(cl_context (cxGPUContext), CL_MEM_WRITE_ONLY, 100, &X, NULL);
cl_mem SMq = clCreateBuffer(cl_context (cxGPUContext), CL_MEM_WRITE_ONLY, 100, &SM, NULL);
cl_mem rezq = clCreateBuffer(cl_context (cxGPUContext), CL_MEM_READ_ONLY, 100, &rez, NULL);
 
 
 
cl_program OpenCLProgram = clCreateProgramWithSource(cl_context (cxGPUContext), 1, OpenCLSource , NULL, NULL);
 
clBuildProgram(OpenCLProgram, 0, NULL, NULL, NULL, NULL);
 
cl_kernel kor = clCreateKernel(cl_program (OpenCLProgram), "kor2.cl", NULL);
 
clSetKernelArg(kor, 0, sizeof(cl_mem), (void*)&Xq);
clSetKernelArg(kor, 1, sizeof(cl_mem), (void*)&SMq);
clSetKernelArg(kor, 2, sizeof(cl_mem), (void*)&rezq);
 
 
cl_int clEnqueueNDRangeKernel(cl_command_queue (cqCommandQue));
 
 
clEnqueueReadBuffer(cqCommandQue, rezq, CL_TRUE, 0, sizeof(cl_float), rezq, 0, NULL, NULL);
 
printf("Hello %f\n", rez); 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2010, 14:06     Программа в OpenCL
Посмотрите здесь:

Глобальная переменная в OpenCL - C++
Всем привет! Кто может подсказать как правильно создать глобальную переменную в OpenCL? unsigned char *globalVariable; __kernel...

OpenCL в Builder и не только - C++ Builder
Все добрый день! На данный момент встала проблема анализа огромного массива данных, времени неделя, а скорость обработки очень мала......

Вывод результата программы в OpenCL - Visual C++
Привет всем! Ребят, нужна ваша помощь очень: написал программу, но застопорился с тем, как правильно вывести результат вычислений. Моим...

Неправильно определяется get_global_id на OpenCL? - C++
Итак, использую OpenCL. Прежде чем что-то написать надо понять, как определяются координаты Work-item, для этого я решил использовать 2d...

OpenCL: clEnqueueReadBuffer не правильно считывает в буфер - C++
В рамках знакомства с OpenCL написал тестовый пример, но на выходе в буфер всегда получаю не верные значения. Тестовый пример: ...

OpenCL vs CUDA. За и против каждой технологии - C++
В скором времени хочу начать изучать программирование на GPU, поэтому столкнулся с вопросом, а что вобщем учить то. Можете пожалуйста без...

Способы затолкать OpenCL и C++ в один файл - C++
Я лично пробовал способы затолкать OpenCL в C++ файл одним нетривиальным способом: использовать трюк с #ifdef чтобы компиляторы не...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shaper
22 / 22 / 2
Регистрация: 05.05.2010
Сообщений: 82
02.08.2010, 17:05     Программа в OpenCL #2
Не разбирался в алгоритме, но при беглом просмотре бросается в глаза вот что:

1. В программе OpenCLSource[] не проинициализирован rez.
2. В конце программы выводится printf("Hello %f\n", rez), но rez в программе не используется - вместо него используется rezq.
Forester04
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 24
04.08.2010, 16:18  [ТС]     Программа в OpenCL #3
Поставил начальное нулевое значение. Спасибо за подсказку. Поковырялся ещё с кодом.
Никак не хочет нормально считать. Вот последний пример программы. Я ещё совсем новичок к сожалению в этом языке. Надеюсь на вашу поддержку.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdafx.h>
#include <CL/cl.h>
 
 
const char* OpenCLSource[] =  {"__kernel void kor (__global float* X, __global float* SM,__global float* rez)"
"{"
"X = 10000;"
"rez = 0;"
"if (X > 1) SM = X / 2; else SM  = 1;"
"for(; (SM != 0); SM /= 2) if ((rez * rez) > X) rez -= SM; else rez += SM;"
"return(rez);"
"}"
};
 
 
int main(int argc, char **argv) 
 
{
 
float X;
float SM;
float rez;
 
 
//Инициализация устройства
cl_context cxGPUContext = clCreateContextFromType(NULL, CL_DEVICE_TYPE_CPU, NULL, NULL, NULL);  
 
 
cl_int cdDevice = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_CPU, NULL, NULL, NULL);
 
//Очерёдность выполнения
cl_command_queue cqCommandQue = clCreateCommandQueue(cl_context (cxGPUContext), NULL, 0, NULL);
//Memory Objects
cl_mem Xq = clCreateBuffer(cl_context (cxGPUContext), CL_MEM_WRITE_ONLY, 100, &X, NULL);
cl_mem SMq = clCreateBuffer(cl_context (cxGPUContext), CL_MEM_WRITE_ONLY, 100, &SM, NULL);
cl_mem rezq = clCreateBuffer(cl_context (cxGPUContext), CL_MEM_READ_ONLY, 100, &rez, NULL);
 
 
 
cl_program OpenCLProgram = clCreateProgramWithSource(cl_context (cxGPUContext), 1, OpenCLSource , NULL, NULL);
 
clBuildProgram(OpenCLProgram, 0, NULL, NULL, NULL, NULL);
 
cl_kernel kor = clCreateKernel(cl_program (OpenCLProgram), "kor.cl", NULL);
 
clSetKernelArg(kor, 0, sizeof(cl_mem), (void*)&Xq);
clSetKernelArg(kor, 1, sizeof(cl_mem), (void*)&SMq);
clSetKernelArg(kor, 2, sizeof(cl_mem), (void*)&rezq);
 
 
clEnqueueWriteBuffer(cqCommandQue, Xq, CL_TRUE, 0, sizeof(cl_float), Xq, 0, NULL, NULL);
clEnqueueWriteBuffer(cqCommandQue, SMq, CL_TRUE, 0, sizeof(cl_float), SMq, 0, NULL, NULL);
 
cl_int clEnqueueNDRangeKernel(cl_command_queue (cqCommandQue));
 
 
clEnqueueReadBuffer(cqCommandQue, rezq, CL_TRUE, 0, sizeof(cl_float), rezq, 0, NULL, NULL);
 
printf("Hello %f\n", rezq); 
}

... На выходе принтэф пишет значение rezq = 0
Shaper
22 / 22 / 2
Регистрация: 05.05.2010
Сообщений: 82
05.08.2010, 14:09     Программа в OpenCL #4
Что делает clCreateBuffer? В строчках 33, 34 и 35 в эту функцию передаются адреса переменных X, SM и rez. Но эти переменные не проинициализированы. Если clCreateBuffer задает им значения - то ничего страшного, а если использует в вычислениях - то это ошибка.

Дальше разбирать не берусь, так как сам не программировал под OpenCL. Единственное, что могу порекомендовать - это протрассировать программу и посмотреть, что и в каком месте выдает каждая функция и является ли результат каждой функции правильным. Кроме этого, рекомендую написать программу OpenCLSource такого содержания:
C++
1
2
3
4
5
const char* OpenCLSource[] =  {"__kernel void kor (__global float* X, __global float* SM,__global float* rez)"
"{"
"rez = 12;"
"return (rez);"
"}"
После запуска, можно будет судить о том, где ошибка - либо это алгоритм выдает 0, либо программа не может вернуть значение. Либо и то, и другое вместе.
Forester04
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 24
13.08.2010, 13:15  [ТС]     Программа в OpenCL #5
Алгоритм скорее всего в порядке. стабильно выдаёт ноль
Shaper
22 / 22 / 2
Регистрация: 05.05.2010
Сообщений: 82
15.08.2010, 22:23     Программа в OpenCL #6
Цитата Сообщение от Forester04 Посмотреть сообщение
Алгоритм скорее всего в порядке. стабильно выдаёт ноль
Вот именно поэтому у вас и не работает. Если вы будете и дальше оперировать терминами "наверное", "кажется" и "скорее всего", вы никогда не найдете ошибку.
Forester04
0 / 0 / 0
Регистрация: 26.07.2010
Сообщений: 24
16.08.2010, 15:36  [ТС]     Программа в OpenCL #7
в данном случае, просто я знаю, что на данном этапе ошибка не в нём.
я пробовал упрощать алгоритм, как на вашем примере.

результат тот же.
}{ottab
14 / 13 / 3
Регистрация: 04.03.2009
Сообщений: 75
01.11.2010, 00:06     Программа в OpenCL #8
Извиняюсь за ответы в совсем не свежих темах но поскольку гугл выдает ссылку на эту тему в которой есть не совсем правдоподобны ответы и задача всетаки не решена то всетаки во благо гредущим с этой проблемой:

Расмотрим ГПУ ядро, которое имеет тип воид а судя по ретурну она должна что-то вернуть, на самом-то деле результаты работи гпу передаются через глобальную память устройства на оперативную с помощью записи данных в эту память на устройстве и приему данных с него функцией clEnqueueReadBuffer.
Теперь к хосту:
На хосте при создании буферов судя с кода есть попытка писать данные в память прямо при созданнии но не указан флаг CL_MEM_COPY_HOST_PTR.Но если дальше идут функции переписи в память то это можно опустить.Переменным float X; float SM; float rez; всетаки стоит присвоить значение. Но неверная работа програмы не только в этом, а и в функции:
C
1
clEnqueueReadBuffer(cqCommandQue, rezq, CL_TRUE, 0, sizeof(cl_float), rezq, 0, NULL, NULL);
переменная rezq это "указатель" на память гпу-девайса и попытка стчитать в него флоатовые данные никцему доброму не приведет.
Daemvil
0 / 0 / 0
Регистрация: 21.12.2009
Сообщений: 19
28.06.2011, 11:13     Программа в OpenCL #9
Блин, сам ковыряюсь с CUDA, пробовал OpenCL, но такой скорости как в куде не получил(в 10 раз), опенцл дает всего в 2 раза быстрей чем на CPU (
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
28.06.2011, 12:47     Программа в OpenCL #10
Хочется поизучать OpenCL. Кто-то сурьёзно использовал, ещё приятные отзывы будут?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2011, 21:37     Программа в OpenCL
Еще ссылки по теме:

OpenCL безразмерный буфер видеокарты RADEON HD6870 - C++
Имею проблему при загрузке массивов в буфер видеокарты под OpenCL (не путать с OpenGL). На борту видео всего 1 Гиг, но умудряюсь записать...

Ошибка сборки кода с kernel-функцией в OpenCL - Visual C++
Всем доброго времени суток. Нужна помощь по Open CL. Вот стандартный кусок __kernel-функции, которая билдится без ошибок: const...

Нужен пример использования OpenCL для параллельных вычислений - Visual C++
Здравствуйте уважаемые господа программисты. Кто нибудь когда нибудь использовал для параллельных вычислений библиотеку opencl? мне нужен...

OpenCL "Hello World" - C++
Ув. Программисты ! Подскажите бога ради как начать писать хоть что нибудь на этом openCL . Я скачал AMD APP SDK 2.8.1 (было...

OpenCL на С++ - Графика и игры
Здравствуйте, уважаемые форумчани. Стоит задача написать знаменитую GameOfLife на С++ с использованием аппаратных средств видеокарты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
}{ottab
14 / 13 / 3
Регистрация: 04.03.2009
Сообщений: 75
28.06.2011, 21:37     Программа в OpenCL #11
Насчет быстродействия куды то это вполне естественно сл относительно молод, так что быстрее куды он работать будет в редких случаях. К примеру я текстуры так эффективно как в куде использовать не смог (вообще никакого прироста), и з доступом к локальной памяти( cuda - Shared memory) были какие-то проблемы влияющие на скорость роботы. А стоит ли изучать, так это конечно. Для владельцев атишных карточек самое то, можно достичь очень хорошого ускорения.
Yandex
Объявления
28.06.2011, 21:37     Программа в OpenCL
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru