Просьба к владельцам видеокарт от 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;
}