ядро cuda не имеет доступа ко всем элементам массива - PullRequest
0 голосов
/ 09 октября 2018

Я написал программу cuda для выполнения некоторых операций с большим массивом.Но когда я передаю этот массив ядру cuda, потоки не обращаются ко всем его элементам.Ниже приведена простая программа, объясняющая мой вариант использования:

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

__global__
void kernel(int n){
        int s = threadIdx.x + blockIdx.x*blockDim.x;
        int t = blockDim.x*gridDim.x;
        for(int i=s;i<n;i+=t){
        printf("%d\n",i);  //printing index of array which is being accessed
        }
}

int main(void){
        int i,n = 10000; //array_size
        int blockSize = 64;
        int numBlocks = (n + blockSize - 1) / blockSize;
        kernel<<<numBlocks, blockSize>>>(n);
        cudaDeviceSynchronize();
}

Я пробовал с другим blockSize = 256, 128, 64, etc, он не печатает все индексы массива.В идеале, он должен печатать любую перестановку 0 to n-1, однако он печатает меньшие (<n) числа.

Если numBlocks и blockSize оба равны 1, то он получает доступ ко всем элементам.И если размер массива меньше 4096, то он также получает доступ ко всем элементам.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Используйте лучшие методы отладки!Ваш код работает нормально

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

#include <stdlib.h>

__global__
void kernel(int* in, int n){
    int s = threadIdx.x + blockIdx.x*blockDim.x;
    int t = blockDim.x*gridDim.x;
    for (int i = s; i<n; i += t){
        in[i] = 1;  //printing index of array which is being accessed
    }
}

int main(void){
    int i, n = 10000; //array_size
    int blockSize = 64;
    int numBlocks = (n + blockSize - 1) / blockSize;
    int* d_res,*h_res;
    cudaMalloc(&d_res, n*sizeof(int));
    h_res = (int*)malloc(n*sizeof(int));

    kernel << <numBlocks, blockSize >> >(d_res, n);
    cudaDeviceSynchronize();
    cudaMemcpy(h_res, d_res, n*sizeof(int), cudaMemcpyDeviceToHost);

    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += h_res[i];
    printf("%d", sum);
}
0 голосов
/ 09 октября 2018

На самом деле все значения печатаются в текущем случае.но вы не сможете увидеть их все из-за ограничения буфера выходной консоли.Попробуйте увеличить размер буфера выходной консоли.

Кроме того, имейте в виду, что вызовы printf внутри ядра выполняются не по порядку.Кроме того, существуют ограничения буфера printf на устройстве, которые описаны в документации .

...