Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2008, 19:55   #1
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию Nvidia CUDA(Linux)

Часть 1. Начало работы и установка драйверов.

Вот выдалась свободная минутка и я решил описать как установить CUDA на ваш компьютер.

Требования: видеокарта Nvidia 8400(не под ноут) и выше.

Я советую установить Ubuntu 8.04. Чтобы не возникло неожиданных осложнений я советую установить ее из под Windows как обычную программу.

Установка соединения с интернет. В справке этот вопрос подробно расписан, отпишусь только для dsl.
Запустите терминал(Приложения->стандартные->терминал)
Пропишите:
sudo pppoeconf
Везде отвечайте да и заполняйте необходимые поля(всего 2 поля имя и пароль соединения)
Запуск соединения:
sudo pon dsl-provider
Остановка:
sudo poff dsl-provider

Установка драйверов для видеокарты.
Скачайте драйвер с оф сайта http://www.nvidia.com/object/cuda_get.html#linux

Перед установкой драйверов потребуется доустановить дополнительные пакеты (если они отсутствую в системе): исходники ядра, утилиты make, bunutils, компилятор gcc, libc6-dev
Запустите терминал(Приложения->стандартные->терминал)
Пропишите
sudo -s -H
для получения прав администратора.
Далее пропишите
apt-get install linux-headers-`uname -r` binutils pkg-config build-essential xserver-xorg-dev
чтобы установить необходимые пакеты.
Далее чтобы продолжить установку драйвера нужно остановить X-Server. Перед остановкой я вам советую переименовать имя драйвера на 1.run например, чтобы было проще.
Останавливаем X-Server
/etc/init.d/gdm stop
Переключитесь в текстовую консоль Ctrl+Alt+F1 и залогиньтесь.
Запустите инсталлятор драйверов (из каталога куда вы их сохранили) от имени root. Если драйвер лежит на рабочем столе, то прописать вам нужно следующее:
sudo -s -H
sh ~/desktop/1.run

Инсталлятор ругнётся на отсутствие precompiled headers для вашего ядра и предложит скачать их с сервера nVidia. Откажитесь. Он предложит скомпилировать их сам - соглашайтесь.
Далее соглашайтесь со всеми требованиями
Включите X-Server
/etc/init.d/gdm start
Теперь нужно немного подправить один файл:
sudo gedit /etc/default/linux-restricted-modules-common
там нужно исправить строчку на вот такую
DISABLED_MODULES="nvidia nvidia_legacy nvidia_new"
Сохраните и перезагрузите компьютер. Если же X-сервер не запустился, то просто восстановите конфигурационный файл:
sudo cp /etc/X11/xorg.conf.backup /etc/X11/xorg.conf
и ищите ошибку в своих действиях или спрашивайте в этой теме.

Не пугайтесь, дальше будет легче.

Последний раз редактировалось Kostia; 13.11.2008 в 16:50.
Kostia вне форума Ответить с цитированием
Старый 13.11.2008, 16:48   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Часть 2.Установка и настройка Nvidia Toolkit и SDK.

Тут нужно немного попотеть и выкачать аж 60 mb из интернета.
http://www.nvidia.com/object/cuda_get.html#linux

gcc-4.1. Для Nvidia Toolkit нужна именно версия 4.1, если стоит другая
можно, не удаляя других версий, дополнительно поставить gcc-4.1.
Чтобы установить gcc 4.1 научимся пользоваться менеджером пакетов Synaptic(Система->Администрирование->Synaptic)
Нажмите на кнопку поиск и наберите gcc 4.1, из предложеных вариантов отметьте gcc 4.1 и нажмите применить.

Возможно может протребоваться установить пакет build-essential. Установите его так же как и gcc.

Теперь нужно установить по умолчанию gcc 4.1.
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 413 --slave /usr/bin/g++ g++ /usr/bin/g++-4.1 --slave /usr/bin/cpp cpp /usr/bin/cpp-4.1
sudo update-alternatives --config gcc


Чтобы проверить введите gcc -v.


Nvidia Toolkit. Пропишите в терминале
sudo sh path/NVIDIA_CUDA_Toolkit_2.0_Ubuntu7_x86 _64.run

Установите в каталог по умолчанию.

Теперь нужно подправить файл /etc/ld.so.conf
sudo gedit /etc/ld.so.conf
Добавте
# NVIDIA CUDA v2.0 support
/usr/cuda/lib


и вызовите ldconfig
sudo ldconfig

Устанавливаем Nvidia CUDA SDK в каталог по умолчанию.

Теперь переходм в папку ~/NVIDIA_CUDA_SDK/
cd ~/NVIDIA_CUDA_SDK

Чтобы откомпилировать пример в режиме эмуляции введите
sudo make emu=1
Чтобы откомпилировать примеры в режиме использования видеокарты нужно ввести
sudo make

И наслаждаемся мощью ваших "ядер"
sudo ./bin/linux/release/nbody
Изображения
Тип файла: jpg Screenshot.jpg (37.4 Кб, 148 просмотров)
Kostia вне форума Ответить с цитированием
Старый 17.11.2008, 14:03   #3
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Дополнение к предыдущей части.
"Компиляция остальных проектов в SDK"

Как вы заметили не все примеры были откомпилированны. Для компиляции остальных проектов нужно пройти в каталог необходимого проекта.

cd ~/NVIDIA_CUDA_SDK/projects/simpleTexture3D
sudo make


Откомпилированный проект будет лежать в том же каталоге где и все остальные проекты. (bin/linux/release)
Kostia вне форума Ответить с цитированием
Старый 17.11.2008, 15:03   #4
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Часть 3. Подготовка почвы.

Для тех кто уже знаком с gcc, эта статья будет малоинтересна т.к. она расчитана на обсолютно не знакомых с gcc.

Начнем gcc - это абривиатура GNU Compiler Collection. Он включает в себя много разных языков программировагия gcc(C), g++(C++), gpc(Pascal)... Нас интересует gcc т.к. CUDA поддерживает только этот язык программирования.

Hello, world!
Да, да, именно с этого мы и начнем. Создайте новый пустой файл на рабочем столе и обзовите его 1.c. Откройте его с помощью текстового редактора.

Код:
#include<stdio.h>
int main(){
  printf("Hello, world!\n");
  return 0;
};
Сохраните, перейдите на рабочий стол, откомпилируйте и запустите.
cd ~/desktop
gcc 1.c
./a.out


OpenGL(glut)
Нужно сначала установить пакет glut. Найдите пакет в Synaptic.(glut/freeglut)

Создайте на рабочем столе папку ogl и новый пустой файл в этой папке, назовите его ogl.c.

Код:
#include <GL/glut.h>

void clear(){
  glClear(GL_COLOR_BUFFER_BIT);

  glFlush();
};

int main(int argc, char** argv){
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(800, 800);
  glutCreateWindow("Hello, world!");

  glClearColor(1.0, 1.0, 1.0, 0.0);
  glutDisplayFunc(clear);
  glutMainLoop();

  return 0;
};
Теперь компилируем
cd ~/desktop/ogl
gcc ogl.c -lglut


Это простой пример инициализации OpenGL.

Теперь можно создать что-то сложнее нежели просто инициализация.

Код:
#include <GL/glut.h>

void init(){
  glClearColor(1.0, 1.0, 1.0, 0.0);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(0.0, 800.0, 0.0, 800.0);
};

void nicePoly(){
  glClear(GL_COLOR_BUFFER_BIT);

  glBegin(GL_POLYGON);

    glColor3f(1.0, 0.0, 0.0);
    glVertex2i(200, 200);
    glColor3f(0.0,0.0,1.0);
    glVertex2i(200, 600);
    glColor3f(1.0,1.0,0.0);
    glVertex2i(600, 600);
    glColor3f(1.0, 0.0, 1.0);
    glVertex2i(600, 200);

  glEnd();

  glFlush();
};

int main(int argc, char** argv){
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(800, 800);
  glutCreateWindow("Polygon");

  init();
  glutDisplayFunc(nicePoly);
  glutMainLoop();

  return 0;
};
Данная программа рисует разноцветный прямоугольник.

P.S. продолжение следует

Последний раз редактировалось Kostia; 18.11.2008 в 11:10.
Kostia вне форума Ответить с цитированием
Старый 20.11.2008, 12:30   #5
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Как я обещал, продолжение следует.
Теперь я хочу рассказать как обрабатывать события клавиатуры и мыши.

Код:
#define ClientWidth 800
#define ClientHeight 600

#include <GL/glut.h>

int xx=400,yy=300;

void mouse(int button, int state, int x, int y){
    xx=x; yy=y;
    if((button==0)&(state==0))
        glClearColor((float)(rand()%100)/100.0, (float)(rand()%100)/100.0, (float)(rand()%100)/100.0, 0.0);
        
	glutPostRedisplay();
}   

void KeyDown(unsigned char key, int x, int y){
    switch (key){
        case 'q':
        case 27: exit(0);break;//esc
        case 'w': yy-=5; break;
        case 's': yy+=5; break;
        case 'a': xx-=5; break;
        case 'd': xx+=5; break;
    };
    glutPostRedisplay();
};

void Reshape(int w, int h){
    glViewport(0, 0, w, h);      
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();            
    glOrtho(0, w, 0, h, -1, 1);  
    glScalef(1, -1, 1);          
    glTranslatef(0, -h, 0); 
}

void Display(){ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glPointSize (5);  
    
    glBegin(GL_POINTS);

      glColor3f(1.0, 0.0, 0.0);
      glVertex2i(xx, yy);

    glEnd();

    glutSwapBuffers();
};

int main(int argc, char** argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(ClientWidth, ClientHeight);
    glutCreateWindow("Point");
    
    srand( (unsigned)time( NULL ) );
    glClearColor((float)(rand()%100)/100.0, (float)(rand()%100)/100.0, (float)(rand()%100)/100.0, 0.0);
    
    glutMouseFunc(mouse);
    glutKeyboardFunc(KeyDown);
    
    glutIdleFunc(Display);
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    
    glutMainLoop();

    return 0;
};
Первое на что я хочу обратить внимание это функция KeyDown. У нее аж 3 параметра
Key - нажатая кнопка
x,y - черт его знает зачем они нужны
Функция идентична OnKeyDown в Delphi.

Рассмотрим функцию mouse. У нее 4 параметра.
Button - 0-левая кнопка, 1-средняя кнопка, 2-правая кнопка
state - 0-Down, 1-Up
x,y - координаты курсора

Далее я хочу обратить внимание на генерацию случайных чисел.
srand( (unsigned)time( NULL ) ); = Randomize
rand()%100 = Random(100)

glutIdleFunc(Display); - установка глобального вызова функции.(Функция вызывается каждый кадр)
glutIdleFunc(0); - stop

glutReshapeFunc(Reshape); - эта функция вызывается при изменении размеров окна.(у нас тут устанавливается матрица проекции для работы с экранными координатами)

glutSwapBuffers(); - переключение буферов для GLUT_DOUBLE.

Информацию об остальных фукция OpenGL вы можете найти в интернете.

Последний раз редактировалось Kostia; 20.11.2008 в 14:25.
Kostia вне форума Ответить с цитированием
Старый 20.11.2008, 14:21   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Загрузка картинок из файлов.
Код:
#define ClientWidth 800
#define ClientHeight 600

#include <iostream>
#include <GL/glut.h>

#include <FreeImage.h>

GLfloat* textura;
int w, h;

FIBITMAP * imagen;

int xx=400,yy=300;

void loadTexture(char *filename){
	printf("try to loadTexture():\n");

	FILE *f = fopen( filename, "r" );
	if ( f == 0 ){
		fprintf(stderr, " can't open file '%s'\n", filename );
		perror("");
		exit(-1);
	}

	if (textura)	delete textura;

	FREE_IMAGE_FORMAT formato = FreeImage_GetFileType( filename, 0 );
	imagen = FreeImage_Load(formato, filename);
	
	imagen = FreeImage_ConvertTo32Bits(imagen);

	w = FreeImage_GetWidth(imagen);
	h = FreeImage_GetHeight(imagen);

	textura  = new GLfloat[w * h * 4];

	GLubyte* pixeles = (GLubyte*)FreeImage_GetBits(imagen);

	for(int j=0; j<w*h; j++){
		textura[ j*4 + 0 ] = (GLfloat)pixeles[j*4+2]/256.0; 
		textura[ j*4 + 1 ] = (GLfloat)pixeles[j*4+1]/256.0; 
		textura[ j*4 + 2 ] = (GLfloat)pixeles[j*4+0]/256.0; 
		textura[ j*4 + 3 ] = (GLfloat)pixeles[j*4+3]/256.0;
	}
 
	printf("Loaded complete\n");
        delete image;
}

void mouse(int button, int state, int x, int y){
    
    xx=x; yy=y;
    
    if((button==0)&(state==0))
        glClearColor((float)(rand()%100)/100.0, (float)(rand()%100)/100.0, (float)(rand()%100)/100.0, 0.0);
        
	glutPostRedisplay();
}   

void KeyDown(unsigned char key, int x, int y){
    switch (key){
        case 'q':
        case 27: exit(0);break;//esc
        case 'w': yy-=5; break;
        case 's': yy+=5; break;
        case 'a': xx-=5; break;
        case 'd': xx+=5; break;
    };
    glutPostRedisplay();
};

void Reshape(int w, int h){
    glViewport(0, 0, w, h);      
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();            
    glOrtho(0, w, 0, h, -1, 1);  
    glScalef(1, -1, 1);          
    glTranslatef(0, -h, 0); 
}

void Display(){
    
    glClear(GL_COLOR_BUFFER_BIT);
      
    glPointSize (1);
    glBegin(GL_POINTS);
     for( int i=0; i<h; i++)
		for( int j=0; j<w; j++){
			glColor3f  ((float)textura[(i*w+j)*4+0],
					(float)textura[(i*w+j)*4+1],
					(float)textura[(i*w+j)*4+2] );
			glVertex3f ( j, (h-i), 0 ); 
		}
    glEnd();
    
    glPointSize (5);  
    
    glBegin(GL_POINTS);

      glColor3f(1.0, 0.0, 0.0);
      glVertex2i(xx, yy);

    glEnd();
    
    glutSwapBuffers();
};

int main(int argc, char** argv){
    loadTexture("ubuntu.jpg");
    
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(ClientWidth, ClientHeight);
    glutCreateWindow("Point");
    
    srand( (unsigned)time( NULL ) );
    glClearColor((float)(rand()%100)/100.0, (float)(rand()%100)/100.0, (float)(rand()%100)/100.0, 0.0);
    
    glutMouseFunc(mouse);
    glutKeyboardFunc(KeyDown);
    
    glutIdleFunc(Display);
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    
    glutMainLoop();

    return 0;
};
В общем для загрзки картинки достаточно скачать библиотеку FreeImage.h и уметь работать с указателями.
Примечание, чтобы компилировать проект нужно ввести
g++ name -lglut -lfreeimage.
Немного прояснимся, ведь CUDA понимает только язык C, а тут C++. Все очень просто, кусочек кода который будет исполняться на видеокарте должен быть написан на C, а остальная программа которая будет ваполняться на процессоре может быть написана как на C так и на C++.

С кодом для загрузки картинки разобраться очень легко.
1. Определили формат загружаемого изображения
2. Загрузили изображение
3. Переделали под 32 бита
4. Выделили память под текстуру
5. Скопировали содержимое image в texture
Изображения
Тип файла: jpg ubuntu.jpg (27.3 Кб, 145 просмотров)
Вложения
Тип файла: zip FreeImage.h.zip (10.9 Кб, 17 просмотров)
Kostia вне форума Ответить с цитированием
Старый 03.12.2008, 04:49   #7
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию Создание собственного проекта на CUDA

Осталось научиться писать собственные программы на CUDA.
/home/kostia/NVIDIA_CUDA_SDK/doc/CUDA_SDK_release_notes_linux.txt

Код:
Создание собственного проекта на CUDA.

Создание новой CUDA программы с помощью NVIDIA CUDA SDK очень просто.
Мы предоставили "типовой"("template") проект, который можно копировать и изменять как вам угодно. Просто выполните следующие действия:

1. Копируйте шаблон

         cd <SDK_INSTALL_PATH>/projects
         cp -r template <myproject>

2. Редактируйте файл

         mv template.cu myproject.cu
         mv template_kernel.cu myproject_kernel.cu
	 mv template_gold.cpp myproject_gold.cpp

3. Изменить Makefile и исходные файлы. Просто поиск и замену всех изменений по "шаблону"("template") с "myproject".

4. Компиляция проекта

         make

         Debug -                make dbg=1
         Emulation -           make emu=1
         Debug emulation - make dbg=1 emu=1

5. Запуск программы

         ../../bin/linux32/release/myproject

    (Он должен напечатать "Test PASSED")

См. в CUDA Programming Guide более подробную информацию о программировании в CUDA.
PS. перевод Семенова Константина.
От автора: Перевел как смог, уж не обессудьте.

Способ описанный выше мне котегорически не понравился и я его сразу же забы и начал поиски иформыции по компиляции проека в другом месте и нашел ее здесь: /usr/local/cuda/doc

Приблизительно компиляция проекта выглядит так:
Режим видеокарты:
/usr/local/cuda/bin/nvcc ${1}1.cu -o gravitation_pole -O3 -I/usr/local/cuda/inc -I ~/NVIDIA_CUDA_SDK/common/inc -lcudart -lcuda -lglut -lfreeimage --host-compilation C++
Режим эмуляции:
/usr/local/cuda/bin/nvcc ${1}1.cu -o gravitation_pole -O3 -I/usr/local/cuda/inc -I ~/NVIDIA_CUDA_SDK/common/inc -lcudart -lcuda -lglut -lfreeimage -deviceemu

1-Путь к помпилятору
2-1.cu-имя файла который нужно компилировать(Может быть любым исходя из имени вашего проекта)
3-gravitation_pole-имя готовой программы(Может быть любым)
4-I-место где нужно искать библиотеки
5-Режим компиляции

Более подробную информацию можно найти в nvcc_2.0.pdf.

Последний раз редактировалось Kostia; 03.12.2008 в 04:52.
Kostia вне форума Ответить с цитированием
Старый 03.12.2008, 05:37   #8
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию Первыя программа на CUDA

Первыя программа на CUDA.

Код:
#include <cutil.h>
#include <cuda.h>

#include <stdio.h>
#include <stdlib.h>

#define N 10

int a[N];
int b[N];
int c[N];

int *aa;
int *bb;                                            
int *cc;

// blockIdx.x    - координата блока потоков в массиве блоков потоков
// threadIdx.x   - координата потока в блоке потоков
// blockDim.x    - количество потоков в блоке потоков по координате .x
// gridDim.x     - количество блоков потоков по координате .x

__global__ void cuda(int *A, int *B, int *C){
	int i = threadIdx.x;
	C[i] = A[i] + B[i];
}
int main( int argc, char ** argv ){

	for(int i=0; i<N; i++){
		a[i]=b[i]=1;
	}


//	cudaMalloc( void ** pointer, size );	 // allocate on GPU
//	cudaMemcpy( void* kuda, void* otkuda, size, cudaMemcpyDeviceToHost | cudaMemcpyDeviceToDevice | cudaMemcpyHostToDevice );

	cudaMalloc((void **)&aa, sizeof(int)*N);
        cudaMalloc((void **)&bb, sizeof(int)*N);
	cudaMalloc((void **)&cc, sizeof(int)*N);

	cudaMemcpy((void *)aa,(void *)a,sizeof(int)*N,cudaMemcpyHostToDevice);
        cudaMemcpy((void *)bb,(void *)b,sizeof(int)*N,cudaMemcpyHostToDevice);
	cudaMemcpy((void *)cc,(void *)c,sizeof(int)*N,cudaMemcpyHostToDevice);

	cuda <<<1, N>>> (aa, bb, cc);
//	CUDA_SAFE_CALL( cudaMemcpy( da, &a, N*blocksQ*threatQ*sizeof(float), cudaMemcpyHostToDevice ) );

	CUT_CHECK_ERROR(" Ow...\n" );

	cudaMemcpy((void *)a,(void *)aa,sizeof(int)*N,cudaMemcpyDeviceToHost);
        cudaMemcpy((void *)b,(void *)bb,sizeof(int)*N,cudaMemcpyDeviceToHost);
	cudaMemcpy((void *)c,(void *)cc,sizeof(int)*N,cudaMemcpyDeviceToHost);

	for(int i=0; i<N; i++){
		printf("%d", c[i]);
	}
	printf("\n");
}
Эта программа просто складывает два массива и выводит результат на экран.

PS. начинаю со строки 39
Для начала нужно выделить память в видеокарте по массивы, для этого есть функция cudaMalloc.

Далее копируем содержимое массивов, которые нужно сложить, в видеопамять.
cudaMemcpy.
Флаги:
cudaMemcpyDeviceToHost - из видео в оперативную память
cudaMemcpyDeviceToDevice - из одной видеокарты в другую
cudaMemcpyHostToDevice - из оперативной в видеопямять

Далее идет вызов функции которая выполняется на видеокарте(__global__).

функция <<кол-во блоков потоков, кол-во потоков в блоке>> (параметры)

Далее копируем из видео в операвную память и вывод результата.

Более подробную информацию смотрите в NVIDIA_CUDA_Programming_Guide_2.0.p df

Последний раз редактировалось Kostia; 03.12.2008 в 05:40.
Kostia вне форума Ответить с цитированием
Старый 03.12.2008, 05:54   #9
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию Дополнительно

Если у вас имеется несколько видеокарт, то вы можете выбрать нужную вам видеокрту воспользовавшись функцией cudaSetDevice.

CUDA_SAFE_CALL( cudaSetDevice( 0 ) );// select GPU ( 0 - first )

Блоки потоков и потоки в видеокарте располагаются не только по оси x но и по оси y. Для того чтобы задать значения по x и y можно воспользовать спец типом dim3.
Код:
dim3 gs,bs;

gs.x=4;
gs.y=4;
bs.x=16;
bs.y=16;

cuda <<<gs,bs>>> (aa,bb,cc);
Для проверки ошибки можно воспользоваться функцией CUDA_SAFE_CALL(функция) и вывести эти ошибки на экран CUT_CHECK_ERROR(" Ow...\n" );

Т.к. потоки и блоки потоков в видеокарте совершенно ни как не связаны между собой, то вам может потребоваться синхронизация. Допустим вы считаете факториал, на один поток приходится больше вычислений чем на другой и может произойти не соответсвие. Для синхронизации предусмотрена функция __syncthreads();. Она ждет пока все потки закончат свои вычисления.

Используйте проверки очень осторожно, иначе может получиться, что один поток выполняется, а остольные ждут его завершения.

Вот в общем и все, дальше сами. Удачи!
Всегда ваш, Семёнов Константин.

Последний раз редактировалось Kostia; 03.12.2008 в 11:26.
Kostia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен человек, который может написать программку для работы на GPU ATI и NVidia legonxt Фриланс 1 10.11.2008 09:58
Проблема с драйверами NVidia DM_bite Компьютерное железо 2 04.11.2008 22:33
Linux на VMware....... WinXP <-> Linux DMUTPUU Операционные системы общие вопросы 1 24.09.2008 12:03
Dрайвера NVIDIA Minimus Помощь студентам 7 11.08.2008 22:07
Linux MAcK Операционные системы общие вопросы 3 26.10.2007 11:03