Решено: Извините, это моя ошибка, я должен использовать atomicAdd(times,1);
вместо *times++
в функции ядра.
Я вызываю функцию ядра следующим образом
dim3 Dg(blockSize, blockSize, blockSize);
dim3 Db(8, 8, 8);
voxelize << < Dg, Db >> > ();
cudaDeviceSynchronize();
Но я обнаружил, что моя программа решает только часть проблемы, поэтому я использую printf()
в своей глобальной функции voxelize ()
, как в следующем коде
__global__ void voxelize(){
printf("the thread blockIdx.x %d, blockIdx.y %d blockIdx.z %d\n", blockIdx.x, blockIdx.y, blockIdx.z);
unsigned int xIndex = blockDim.x * blockIdx.x + threadIdx.x;
unsigned int yIndex = blockDim.y * blockIdx.y + threadIdx.y;
unsigned int zIndex = blockDim.z * blockIdx.z + threadIdx.z;
unsigned int i = zIndex * blockDim.x*blockDim.y+ yIndex * blockDim.x+ xIndex;
}
Выходные данные показали только последнюю часть каждого выполненного измерения (то есть blockIdx.x всегда равен 5, только некоторые из blockIndex.z изменяются с 0 на 5). Но я не понимаю, почему что-то не так, когда я вызываю эту функцию ядра?
Мой компьютер с GTX1050Ti MaxQ и cuda 10.
После этого я передал указатель ядру для контроля времени работы.
int blockSize = ceil(pow(triangles.size() 69664 / 512.0, 1.0 / 3));
dim3 Dg(blockSize, blockSize, blockSize);
dim3 Db(8, 8, 8);
int* times = new int(0);
int* gpu_times;
cudaMalloc((void **)&gpu_times, sizeof(int));
cudaMemcpy(gpu_times, times, sizeof(int), cudaMemcpyHostToDevice);
voxelize << < Dg, Db >> > (gpu_times);
cudaDeviceSynchronize();
cudaMemcpy(times, gpu_times, sizeof(int), cudaMemcpyDeviceToHost);
std::cout << *times << std::endl;
ядро модифицировано как
__global__ void voxelize(int* times){
(*times)++;
printf("the thread blockIdx.x %d, blockIdx.y %d blockIdx.z %d\n", blockIdx.x, blockIdx.y, blockIdx.z);
unsigned int xIndex = blockDim.x * blockIdx.x + threadIdx.x;
unsigned int yIndex = blockDim.y * blockIdx.y + threadIdx.y;
unsigned int zIndex = blockDim.z * blockIdx.z + threadIdx.z;
unsigned int i = zIndex * blockDim.x*blockDim.y+ yIndex * blockDim.x+ xIndex;
}
вывод
вывод показывает, что он работает 141 раз, но на самом деле вывод должен быть намного больше, чем 69664
извините, это моя вина, я должен использовать atomicAdd(times,1);
вместо *times++
.
Но почему printf()
выводит только часть индекса, как я описал ранее?