Я очень новичок в cuda. Я использую cuda на своей Ubuntu 10.04 в режиме эмуляции устройства.
Я пишу код для вычисления квадрата массива, который выглядит следующим образом:
#include <stdio.h>
#include <cuda.h>
__global__ void square_array(float *a, int N)
{
int idx = blockIdx.x + threadIdx.x;
if (idx<=N)
a[idx] = a[idx] * a[idx];
}
int main(void)
{
float *a_h, *a_d;
const int N = 10;
size_t size = N * sizeof(float);
a_h = (float *)malloc(size);
cudaMalloc((void **) &a_d, size);
for (int i=0; i<N; i++) a_h[i] = (float)i;
cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
square_array <<< 1,10>>> (a_d, N);
cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);
// Print results
for (int i=0; i<N; i++) printf(" %f\n", a_h[i]);
free(a_h);
cudaFree(a_d);
return 0;
}
Когда я запускаю этот код, он не показывает никаких проблем, он дает мне правильный вывод.
Теперь моя проблема в том, что когда я использую <<< 2,5 >>> или <<< 5,2 >>>, результат остается тем же. что происходит на GPU?
Все, что я понимаю, это то, что я просто запускаю ядро cuda с 5 блоками, содержащими 2 потока.
Может кто-нибудь объяснить мне, как Gpu справляется с этим или осуществляет запуск (вызов ядра)?
Теперь моя настоящая проблема в том, что когда я вызываю ядро с <<< 1,10 >>> Это нормально. Это показывает идеальный результат.
но когда я вызываю ядро с <<< 1,5 >>, результат будет следующим:
0.000000
1.000000
4.000000
9.000000
16.000000
5.000000
6.000000
7.000000
8.000000
9.000000
аналогично, когда я уменьшаю или увеличиваю второй параметр в вызове ядра, он показывает другой результат, например, когда я изменяю его на << 1,4 >>, он показывает следующий результат:
0.000000
1.000000
4.000000
9.000000
4.000000
5.000000
6.000000
7.000000
8.000000
9.000000
Почему этот результат приходит?
Может ли кто-нибудь объяснить, как работает запуск ядра?
что содержит переменная типа blockdim?
Пожалуйста, помогите мне понять концепцию запуска и работы вызова ядра?
Я искал руководство по программированию, но они не очень хорошо это объяснили.