LINUX.ORG.RU

[cuda] [ночь] Я туплю или так и должно быть?

 


0

1

Просьба к владельцам видеокарт от nvidia (любых) и cuda-sdk - скомпилировать и запустить нижеуказанный код.

Ничего вредоносного там нет :-P это не скрипт на перле. По замыслу он должен инициализировать трёхмерный массив числами от 0 до 78*78*78-1. Только ни хрена не получается, ничего не работает.

Если использовать одномерные или двумерные гриды и блоки, то вроде работает (только не так удобно работать с трёхмерными массивами), а вот так - засада какая-то. Или может я на ночь глядя опечатку в коде допустил?

Разумеется, мне не это нужно - а более серьёзная вычислительная задача - только там такие же болты, долго думал, где ошибка, а оказывается, он и с такой простой тестовой задачей не справляется. %) Или может, это хардварная проблема, видеокарта не поддерживает такое? Вообще странно.

Просьба нижайшая - запустите, и скажите, что выведет (всё постить необязательно, в двух словах - работает или нет)

Кастую в тред Reset, Eddy_Em, vertexua, плохо помню, кто ещё в этой матчасти разбирается... И необязательно разбираться - просто скомпильте и запустите ;) и скажите. что получится.

#include <iostream>

#define BLOCK_SIZE 8
#define ARRAY_SIZE 78

__global__ void testKernel(float *data) {
    int ix = blockIdx.x * blockDim.x + threadIdx.x;
    int iy = blockIdx.y * blockDim.y + threadIdx.y;
    int iz = blockIdx.z * blockDim.z + threadIdx.z;
    if (ix > ARRAY_SIZE) return;
    if (iy > ARRAY_SIZE) return;
    if (iz > ARRAY_SIZE) return;
    
    int index = ix+iy*ARRAY_SIZE+iz*ARRAY_SIZE*ARRAY_SIZE;
    data[index] = index;
}

int main(int argc, char *argv[]) {
    int size = ARRAY_SIZE*ARRAY_SIZE*ARRAY_SIZE;
    float *devData = NULL;
    float *outData = new float[size];
    
    for (int i=0; i!=size; i++) {
	outData[i] = 0 ;
    }
    
    cudaMalloc((void**)&devData,size*sizeof(float));
    
    dim3 blockSize(BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE);
    dim3 gridSize(ARRAY_SIZE/BLOCK_SIZE+1,ARRAY_SIZE/BLOCK_SIZE+1,ARRAY_SIZE/BLOCK_SIZE+1);
    
    testKernel<<<gridSize,blockSize>>>(devData);

    cudaMemcpy(outData,devData,sizeof(float)*size,cudaMemcpyDeviceToHost);
    
    for (int i=0; i!=size; i++) {
	std::cout << outData[i] << std::endl;
    }
    
    cudaFree(devData);
    delete[] outData;
  
    return 0;
}

Опечаток не заметно. Сейчас поставлю этот Cuda Toolkit и попробую, карточка есть.

amomymous ★★★
()

Итак, не работает. Выводит сначала кучу нулей, потом кучу больших чисел (xxxE+xxx) в бесконечном цикле.

amomymous ★★★
()

не работает, причём не работает очень быстро. карточка у меня подходящая, аналогичный пример на Haskell отрабатывает хорошо

jtootf ★★★★★
()
7.18548e-39
7.09328e-39
7.36987e-39
7.55426e-39
7.18583e-39
7.37023e-39
7.73865e-39
7.92304e-39

И в том же духе

Eddy_Em ☆☆☆☆☆
()
#include <stdio.h>
#include <stdlib.h>

#define BLOCK_SIZE 8
#define ARRAY_SIZE 78

cudaError_t CUerr;
inline int CUERROR(char *str){
	if(CUerr != cudaSuccess){
		fprintf(stderr, "%s, %s\n", str, cudaGetErrorString(CUerr));
		return 1;
	}else return 0;
}
#define CUALLOC(var, size)		do{				\
	CUerr = cudaMalloc((void**)&var, size);		\
	if(CUERROR("CUDA: can't allocate memory")){	\
		exit(1);								\
}}while(0)
#define CUMOV2HOST(dest, src, size) do{			\
	CUerr = cudaMemcpy(dest, src, size,			\
				cudaMemcpyDeviceToHost);		\
	if(CUERROR("CUDA: can't copy data to host")){\
		exit(1);								\
}}while(0)
#define CUMOV2DEV(dest, src, size) do{			\
	CUerr = cudaMemcpy(dest, src, size,			\
				cudaMemcpyHostToDevice);		\
	if(CUERROR("CUDA: can't copy data to device")){\
		exit(1);								\
}}while(0)
#define CUFREE(var) do{cudaFree(var); var = NULL; }while(0)

__global__ void testKernel(float *data) {
    int ix = blockIdx.x * blockDim.x + threadIdx.x;
    if (ix > ARRAY_SIZE) return;
    data[ix] = (float)ix;
}

int main(int argc, char *argv[]) {
	int size = ARRAY_SIZE;
	int SZ = size * sizeof(float), i;
	float *devData = NULL;
	float *outData = (float*)malloc(SZ);
	if(!outData){
		fprintf(stderr, "Can't allocate outData\n");
		exit(1);
	}
	CUALLOC(devData, SZ);
	dim3 blockSize(BLOCK_SIZE);
	int BLK = (ARRAY_SIZE + BLOCK_SIZE - 1) / BLOCK_SIZE;
	dim3 gridSize(BLK);
	cudaMemset(devData, 0, SZ);
	testKernel<<<gridSize, blockSize>>>(devData);
	cudaThreadSynchronize();
	CUMOV2HOST(outData, devData, SZ);
	CUFREE(devData);
	for(i=0; i!=size; i++)
		printf("%g\n", outData[i]);
	free(outData);
	return 0;
}

В одномерном случае отлично работает.

А в вашем не работает, т.к. слишком много (474552) блоков. Разбивайте покрупнее.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А в вашем не работает, т.к. слишком много (474552) блоков. Разбивайте покрупнее.

gridSize в смысле? blockSize 8x8x8, пробовал ещё 4x4x4 - впрочем, это итак 512 не так много, должно помещаться.

не думал, что на gridSize какое-то ограничение есть... наверное, проглядел.

стоп... вообще-то gridSize в этом случае 10x10x10. То есть 1000 блоков, по 512 нитей в каждом блоке... откуда вы взяли 474552? %)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от amomymous

в бесконечном цикле.

Ээ, странно. цикл то конечный. у меня в конечном цикле выводит. =) правда, какие числа - это кому как повезёт... «мусор», в общем.

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Если заменить ARRAY_SIZE с 78 на, например, 16 - тоже белиберду выводит. тоже не работает.

Так что проблема не в количестве блоков, отнюдь. А в чём - я как-то так и не пойму... если у всех также работает, а не у меня одного.

Попробую перевести в одномерный случай (двумерный тут не к месту, а вот трёхмерный был бы удобен). Правда, это чуть запутаннее =) трёхмерные блоки тут были бы очень кстати и очень удобны.

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

стоп... вообще-то gridSize в этом случае 10x10x10. То есть 1000 блоков, по 512 нитей в каждом блоке... откуда вы взяли 474552? %)

Да, извиняюсь. Но все равно, какой-то «косяк» там получается.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от BattleCoder

Почитайте мануал. Сдается мне, что в трехмерном случае количество блоков вообще ограничено восемью.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

там, кстати, есть пример перемножения матриц, но он двумерный...

надо поискать трёхмерные примеры.

везде, где только можно используется threadIdx.x и blockIdx.x, реже y используется. Хотя в документации вроде бы сказано, что можно все три применять =) (иначе зачем они вообще)

Я так понял, вам такое не приходилось и одномерных гридов/блоков всегда хватало =)

надо ещё попробовать пошаманить трёхмерный блок/двумерный грид и наоборот... что получится. но такой вариант мне не подходит.

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Я в основном двумерными занимался (обработка изображений).

Eddy_Em ☆☆☆☆☆
()

сходу меня смущает, что ты во float пишешь int. проверить смогу только дома вечером

Reset ★★★★★
()
Ответ на: комментарий от Reset

буду благодарен. Хотя думаю, будет тоже самое, что и у меня =) и у всех остальных.

А где я во float пишу int? Аа, понял... но не думаю, что это важно. Приведение типов работает. Вместо index пробовал подставлять единицы, девятки, пробовал 0.01 и много чего пробывал. В результате попросту ничего не меняется...

Можно ещё попробовать index/1.0 сделать... думаю, на результат не повлияет.

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Ну, я на всякий случай добавил явное преобразование типов. С двумерным случаем работает на ура, а вот трехмерный - косячит.

Eddy_Em ☆☆☆☆☆
()

какая версия девайса ? покажите выхлоп /opt/cuda/sdk/C/linux/../deviceQuery
Не на всех девайсах можно создать грид с размерностью больше чем N x N x 1
Возможность создания трехмерных решеток появилась только на последних версиях тесел
До теслы наверное доберусь только завтра, но для примера вывод deviceQuery для GeForce GTX 28 :
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1

b_a
()
Ответ на: комментарий от b_a

GeForce 9800 GT, версия 1.1 вроде бы, насколько помню.

покажите выхлоп /opt/cuda/sdk/C/linux/../deviceQuery

Домой приду, покажу...

Не на всех девайсах можно создать грид с размерностью больше чем N x N x 1 Возможность создания трехмерных решеток появилась только на последних версиях тесел

Надо же, я не знал. Хотя подозревал.

Мне один товарищ (он с матчастью плоховато знаком, потому не виноват) утверждал, что теслы ничем не отличаются от обычных игровых видеокарт, всё в точности также. Может, будет повод заставить родной университет раскошелиться хотя бы на одну теслу? :)

Можете прувом поделиться, что трёхмерные гриды поддерживаются только на теслах (и на обычных бюджетно-игровых видяхах их нет?)

Maximum sizes of each dimension of a grid: 65535 x 65535 x 1

А.. всё понял. Туплю. Пруф не нужен, прувом будет выхлоп этого deviceQuery =)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от b_a

Всё. Понял. Я действительно тупой. =)

Просто в документации это нигде не акцентируется... видимо, мелочью считается.

http://ru.wikipedia.org/wiki/CUDA (там ниже таблица)

Maximum dimensionality of grid of thread blocks - для версий 1.0,1.1,1.2,1.3 - 2, для версии 2.x - 3

и для всех версий по любой координате максимум 65535. Думаю, у меня тоже будет 65535x65535x1.

Впрочем, блоки могут быть трёхмерными, причём по первым двум координатам максимум 512, а по третьей почему-то 64. Хотя максимум нитей всё равно 512, поэтому для трёхмерного блока будет 8x8x8, получается, тут я не ошибся.

Правда, нюанс в том, что один потоковый мультипроцессор может выполнять 768 нитей (по крайней мере на моей видяхе), поэтому, чтобы его полностью нагрузить, размер блока должен быть 256 (будет три блока выполнять одновременно).

Если в одномерном случае это 256x1x1, в двумерной 16x16x1, то с трёхмерным непонятно =) 4x4x4 что ли лучше делать?

тут наверное только экспериментировать =) и сравнивать, что быстрее.

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от qnikst

сам разобрался

не разобрался. сам код простой как валенок, но работает чудовищно медленно

в рассылке поспрашивал

пока жду ответа, а вечером полезу ковыряться в потрохах

jtootf ★★★★★
()
Ответ на: комментарий от b_a
Found 1 CUDA Capable device(s)

Device 0: "GeForce 9800 GT"
  CUDA Driver Version / Runtime Version          4.2 / 4.1
  CUDA Capability Major/Minor version number:    1.1
  Total amount of global memory:                 512 MBytes (536543232 bytes)
  (14) Multiprocessors x ( 8) CUDA Cores/MP:     112 CUDA Cores
  GPU Clock Speed:                               1.50 GHz
  Memory Clock rate:                             900.00 Mhz
  Memory Bus Width:                              256-bit
  Max Texture Dimension Size (x,y,z)             1D=(8192), 2D=(65536,32768), 3D=(2048,2048,2048)
  Max Layered Texture Size (dim) x layers        1D=(8192) x 512, 2D=(8192,8192) x 512
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       16384 bytes
  Total number of registers available per block: 8192
  Warp size:                                     32
  Maximum number of threads per block:           512
  Maximum sizes of each dimension of a block:    512 x 512 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 1
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             256 bytes
  Concurrent copy and execution:                 Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Concurrent kernel execution:                   No
  Alignment requirement for Surfaces:            Yes
  Device has ECC support enabled:                No
  Device is using TCC driver mode:               No
  Device supports Unified Addressing (UVA):      No
  Device PCI Bus ID / PCI location ID:           1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 4.2, CUDA Runtime Version = 4.1, NumDevs = 1, Device = GeForce 9800 GT
[deviceQuery] test results...
PASSED
BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от jtootf

Логично... вы запустите deviceQuery (должен быть в дистрибутиве cuda в примерах, возможно, его надо скомпилить предварительно).

И посмотрите, скорее всего у вас как у меня 65535x65535x1.

Уже переделал свой код под одномерный случай (блоки тоже пришлось сделать одномерными). теперь расстраиваюсь по-другому поводу =) результат подсчёта интеграла с результатом подсчёта на CPU не сходится =) на 0.001 меньше примерно (если точнее, то на 0.000886 разница).

Проблема в том, что мне такие интегралы в моей задаче надо считать десятки тысячи раз, а там разница может сдать уже более значительной :(

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

скорее всего у вас как у меня 65535x65535x1

да, у меня такая же карточка

результат подсчёта интеграла с результатом подсчёта на CPU не сходится =) на 0.001 меньше примерно

а можно какую-нибудь из практически полезных задач? мне для себя - потестировать пакеты для Haskell - но может чего полезного смогу подкрутить, мало ли

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Не знаю даже... ну у меня дипломная работа =) мне надо одну физическую задачу решить. Поделиться ею по определённым причинам не могу...

Думаю, полно того, чем можно занять свою карточку. Насчёт хаскеля не знаю (не знаком с этим языком, будет время - обязательно начну), наверное, на нём было бы удобнее всю эту радость писать, чем на голом C.

Ну вот например можете попробовать какой-нить архиватор написать =) или шифровальщик =) который разгружает ЦП и нагружает видяху для каких-то рассчётов. К тому же там целочисленная арифметика, там точность не пострадает.

P.S. Зато быстрее считает... как я посмотрю. 225.5 миллисекунд на CPU, 13 миллисекунд на GPU. И это ведь с учётом того, что он данные туда-сюда пересылает (суммирование я выполняю на CPU, потом может перенесу на GPU, это просто сложнее). Хотя точность и страдает...

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

не, так-то я сам что-нибудь придумаю, спасибо :)

jtootf ★★★★★
()
Ответ на: комментарий от BattleCoder

результат подсчёта интеграла с результатом подсчёта на CPU не сходится

Может, виноват float? CUDA же должна уметь двойную точность?

amomymous ★★★
()
Ответ на: комментарий от amomymous

Нет. Не умеет двойную точность. По крайней мере в compute capabilty 1.1, начиная с 1.3 по-моему умеет.

На CPU тоже считал на float, для чистоты сравнения. Если считать на double, то разумеется, тоже расхождения в результате =)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

http://developer.nvidia.com/cuda-gpus - собственно говоря список, какие карты что поддерживают. Из него например можно увидеть, что не все теслы одинаково полезны. А с Compute Capability 2.1 тесел еще нет. А среди обычных карточек уже есть.

b_a
()
Ответ на: комментарий от b_a

А с Compute Capability 2.1 тесел еще нет. А среди обычных карточек уже есть.

Я тоже заметил. На википедии такой же список. Разве что на оффсайте он может оказаться более новый/свежий =)

Покупать ради этого новую карточку у меня нет желания всё равно =) если мне один раз попользоваться надо... ладно, посмотрим... мне может и 2.0 хватит.

Да и для 1.1 код тоже надо написать. чтобы работал (пусть и более ущербно, с одинарной точностью), заодно будет что сравнить.

BattleCoder ★★★★★
() автор топика

Чтобы всё-таки не создавать новый тред.

Столкнулся с ещё одной проблемой. Ни хрена непонятно. Код вроде пишу правильный - проверял и перепроверял. Все _должно_ по задумке работать.

Отладчиком я пока пользовался нормально не научился (да и не уверен, как он должен уметь ядра отлаживать, потом с ним обязательно разберусь). Пока вместо отладки сделал вот такой финт ушами (смотреть ниже).

Код, понятно, привожу, не весь, специально упростил, убрал лишнее. Чтобы не спрашивали «что код должен делать» =)

В общем, вот привожу (он должен скомпилироваться и запуститься, можете у себя проверить):

#include <iostream>

#define BLOCK_SIZE 8
#define ARRAY_SIZE 78

__constant__ float devConstant1;
__constant__ float devConstant2;

__global__ void testKernel(float *data) {
    uint3 step = make_uint3(ARRAY_SIZE/blockDim.x, ARRAY_SIZE/blockDim.y, ARRAY_SIZE/blockDim.z);
    for (uint iz = threadIdx.z; iz < ARRAY_SIZE; iz += step.z ) {
	for (uint iy = threadIdx.y; iy < ARRAY_SIZE; iy += step.y) {
	    for (uint ix = threadIdx.x; ix < ARRAY_SIZE; ix += step.x) {
		    float tmp1 = devConstant1;
		    float tmp2 = devConstant2;
		    tmp1 = sinf(tmp1);
		    tmp2 = sinf(tmp2);
	    }
	}
    }

    data[blockIdx.x] = 12;
}

int main(int argc, char *argv[]) {
    int size = ARRAY_SIZE;
    float *devData = NULL;
    float *outData = new float[size];
    
    for (int i=0; i!=size; i++) {
	outData[i] = 0 ;
    }
    
    cudaMalloc((void**)&devData,size*sizeof(float));
    
    float constant1 = 10;
    float constant2 = 20;
    cudaMemcpyToSymbol("devConstant1",&constant1,sizeof(float));
    cudaMemcpyToSymbol("devConstant2",&constant2,sizeof(float));
    
    dim3 blockSize(BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE);
    dim3 gridSize(ARRAY_SIZE,1,1);
    
    testKernel<<<gridSize,blockSize>>>(devData);

    cudaMemcpy(outData,devData,sizeof(float)*size,cudaMemcpyDeviceToHost);
    
    for (int i=0; i!=size; i++) {
	std::cout << outData[i] << std::endl;
    }
    
    cudaFree(devData);
    delete[] outData;
  
    return 0;
}

Объяснение: в общем, что я делаю. Создаю две константы (contant1, constant2, пробовал как float, так и int, результат одинаковый). Записываю их в константные переменные devConstant1, devContstant2. Затем запускаю ядро, что-то выполняю (здесь это опустил чтобы не путалось под глазами). В результате fail.

В общем, если эти строки закомментировать (хотя бы одну из них, последнюю):

float tmp1 = devConstant1;
float tmp2 = devConstant2;
tmp1 = sinf(tmp1);
tmp2 = sinf(tmp2);

то я послушно вижу в результате столбик из чисел «12», или чего угодно, что подставить в

data[blockIdx.x] = 12;

Если же эти строки не комментировать - то результат не изменяется, вместо требуемого числа (12, например), пишется не то, что надо. Например, если заменить 12 на 1212, то в столбике останется 12.

Простите, если непонятно объяснил (проблемы у меня с этим) - запустите несколько раз - сами поймёте. Или может у меня глюки в оборудованием и этот код должен работать нормально? %)

Кастую в тред amomymous, jtootf, Eddy_Em, Reset, b_a, qnikst,

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

В результате fail

у меня всё работает. точно никакого мусора в системе сборки не осталось?

запустите несколько раз - сами поймёте

прогнал 100 раз. запустил в профайлере - ничего необычного не вижу

jtootf ★★★★★
()
Ответ на: комментарий от BattleCoder

Запустил у себя. Все работает.
cuda toolkit & sdk - 4.1
nvidia driver 295.20
cuda-memcheck тоже говорит, что все в порядке.
Что могу сказать, у самого в последнее время как перешел на cuda 4.1 и новые драйвера есть стойкое ощущение, что временами происходит примерно следующие : берем программу, пишем код, выполняем н-ое количество раз. Изменяем код, выполняющийся на карте - запускаем, как результат получаем результат, который выдавала предыдущая версия программы. Выходим из иксов, делаем rmmod nvidia и входим в иксы - все работает как надо.
Но такое поведение есть не всегда. Поэтому в последнее время отлаживаю прогу на удаленной машине где нет иксов.
Еще могу посоветовать для отладки использовать cuPrintf. Эта штука позволяет выводить информацию из куда ядер. http://www.jeremykemp.co.uk/08/02/2010/cuda-cuprintf/

b_a
()
Ответ на: комментарий от b_a

Что могу сказать, у самого в последнее время как перешел на cuda 4.1 и новые драйвера есть стойкое ощущение, что временами происходит примерно следующие : берем программу, пишем код, выполняем н-ое количество раз. Изменяем код, выполняющийся на карте - запускаем, как результат получаем результат, который выдавала предыдущая версия программы. Выходим из иксов, делаем rmmod nvidia и входим в иксы - все работает как надо.

Тут всё совсем по-другому... тут просто не доходит до кода [code]data[blockIdx.x] = (что-то);[/code] и он не выполняется.

А если убрать строки, которые считают синус (хотя бы одну) - то выполняется.

Странно, что это только у меня.... у меня мыслей вообще нет...

Драйвер 295.20-r1, cuda-4.1

Иксы пробовать перегрузить бессмысленно в этом случае =)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от b_a

cudaMemcheck тоже говорит, что нет ошибок =) но при этом выводит ерунду какую-то...

а cuda-gdb умеет отлаживать «внутри» ядра? Я просто плохо представляю, как это возможно...

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от jtootf

у меня всё работает. точно никакого мусора в системе сборки не осталось?

Никакого мусора. Если запустить в точности этот код - выводит мусор:

[code]1.0899e-13 5.16621e-14 2.38554e-14 1.07309e-14 4.70239e-15 2.00741e-15 8.34809e-16 3.38201e-16 1.33474e-16 5.13166e-17[/code]

Если закомментировать строку [code]tmp2 = sinf(tmp2);[/code] И написать, например [code]data[blockIdx.x]=100500[/code], скомпилировать. послушно выводит 100500.

Если её снова раскомментировать, и вместо 100500 написать, например, 500100, снова скомпилировать - запустить. Выводит по-прежнему 100500 (хотя должен 500100).

Я уже 100500 раз перепроверил %( всё тоже самое. Странно, что у вас работает... версия cuda/драйвера такая же?

Попробовать что ли на другой видяхе тот же код запустить... только такой под рукой нет.

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от Reset

эх... что же у меня тогда не так...

я просто в ступоре %)

а нет ли кого на лоре с такой же видяшкой как у меня? geforce 9800 gt? или хотя бы любой 8-9 серии.

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Можно взять например отсюда:
http://stanford-cs193g-sp2010.googlecode.com/svn/trunk/tutorials/util/cuPrint...
http://stanford-cs193g-sp2010.googlecode.com/svn/trunk/tutorials/util/cuPrint...
cuda-gdb - не показывает как код выполняется на карте. Во всяком случае на картах до ферми точно. На последних теслах я еще не пробовал отладкой заниматься.
Похожая ситуация - не выполнения куска кода была у меня когда я пытался считать с трехмерным гридом на карте, которая это не поддерживала.
Дебагер себя при этом ведет следующим образом - если ядро отработало как надо - то будет написано что ядро было запущено с такими то параметрами dimGrim dimBlock и что оно закончило работу. В случае если на этапе выполнения что то произошло (как например для случая с трехмерным гридом) то по крайней мере отсутствует сообщение о завершение ядра.
Мои карточки это - VGA compatible controller: nVidia Corporation GT218 [NVS 3100M] (rev a2).
VGA compatible controller: nVidia Corporation GT200 [GeForce GTX 280] (rev a1)
Везде все работает нормально.

b_a
()
Ответ на: комментарий от BattleCoder

а нет ли кого на лоре с такой же видяшкой как у меня? geforce 9800 gt?

DeviceProperties

  • deviceName = «GeForce 9800 GT»
  • computeCapability = 1.1
  • totalGlobalMem = 536150016
  • totalConstMem = 65536
  • sharedMemPerBlock = 16384
  • regsPerBlock = 8192
  • warpSize = 32
  • maxThreadsPerBlock = 512
  • maxThreadsPerMultiProcessor = 768
  • maxBlockSize = (512,512,64)
  • maxGridSize = (65535,65535,1)
  • maxTextureDim1D = 8192
  • maxTextureDim2D = (65536,32768)
  • maxTextureDim3D = (2048,2048,2048)
  • clockRate = 1625000
  • multiProcessorCount = 14
  • memPitch = 2147483647
  • memBusWidth = 256
  • memClockRate = 950000
  • textureAlignment = 256
  • computeMode = Default
  • deviceOverlap = True
  • concurrentKernels = False
  • eccEnabled = False
  • asyncEngineCount = 1
  • cacheMemL2 = 0
  • tccDriverEnabled = False
  • pciInfo = PCI {busID = 1, deviceID = 0, domainID = 0}
  • kernelExecTimeoutEnabled = True
  • integrated = False
  • canMapHostMemory = True
  • unifiedAddressing = False
jtootf ★★★★★
()

то есть у меня у одного такая байда? %) что такое? я в ступоре :(

BattleCoder ★★★★★
() автор топика

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

Да и просто странно это всё! что за бред %(

под шиндошс что ли попробовать запустить? только туда ещё cuda надо ставить... и ещё перезагружаться туда

BattleCoder ★★★★★
() автор топика

All CUDA devices are used for display and cannot be used while debugging

Это появляется при запуске cuda-gdb.

Да уж =) действительно очень смешно. мне иксы что ли вырубать? Размечтались... эх... А я ещё думал отладчик с GUI поискать для CUDA :) теперь как-то странно эта мысль звучит.

BattleCoder ★★★★★
() автор топика

Кстати, те, кто запускали последний код - поделитесь, какая у вас версия gcc и версия ядра (ну на всякий случай).

gcc --version
gcc (Gentoo 4.5.3-r2 p1.0, pie-0.4.6) 4.5.3
uname -r
3.2.6-gentoo
BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от b_a

Спасибо за cuprintf. Может, в будущем пригодится.

К сожалению, в данном случае он мне не помогает... моё ядро _ничего_ не выводит. Пример оттуда скомпилил и запустил - он работает.

Пошаманил немного и выяснил... что дело в размере блока. То ли слишком большие блоки он не понимает, то ли слишком трёхмерные (в примере блок и грид одномерные).

Буду разбираться по-другому =)

BattleCoder ★★★★★
() автор топика
Ответ на: комментарий от BattleCoder

Если память мне не изменяет, то где-то на версии 3 они выкинули поддержку -device-emu.
cuda-gdb - если одна карточка, то да работаем в чистой консольке, без иксов. С двумя карточками можно работать и в иксах. С неким подобием интерфейса можно запускать так cuda-gdb -tui

b_a
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.