1

私は理解できない問題に直面しました。デバイスに配列の値を設定しようとしています。int 配列を使用すると、次のようになります。

#define VECTOR_SIZE 8
int main()
{
    printf("Start\n");
    int *input_d;
    int *output_d;
    int output_h[VECTOR_SIZE];
    int input_h[VECTOR_SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    int size = VECTOR_SIZE*sizeof(int);
    cudaMalloc(&input_d,size);
    cudaMalloc(&output_d,size);
    cudaMemcpy(input_d,input_h,size,cudaMemcpyHostToDevice);
    kernel<<<1,VECTOR_SIZE>>>(input_d,output_d);
    cudaMemcpy(output_h,output_d,size, cudaMemcpyDeviceToHost);
    cudaFree(input_d);
    cudaFree(output_d);
    return 0;
}

カーネルは次のようになります。

__global__ void kernel(int* input, int* output)
{
    int dx = threadIdx.x + (blockDim.x * blockIdx.x);
    output[dx] = dx;
}

出力 (output_h) は、予想どおり {0, 1, 2, 3, 4, 5, 6, 7} です。今、float配列で同じことをしようとしているとき:

#define VECTOR_SIZE 8
int main()
{
    printf("Start\n");
    float *input_d;
    float *output_d;
    float output_h[VECTOR_SIZE];
    float input_h[VECTOR_SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    int size = VECTOR_SIZE*sizeof(float);
    cudaMalloc(&input_d,size);
    cudaMalloc(&output_d,size);
    cudaMemcpy(input_d,input_h,size,cudaMemcpyHostToDevice);
    kernel<<<1,VECTOR_SIZE>>>(input_d,output_d);
    cudaMemcpy(output_h,output_d,size, cudaMemcpyDeviceToHost);
    cudaFree(input_d);
    cudaFree(output_d);
    return 0;
}

カーネルを使用:

__global__ void kernel(float* input, float* output)
{
    int dx = threadIdx.x + (blockDim.x * blockIdx.x);
    output[dx] = dx;
}

デバイスの output_h 変数に配列がありません。

float 配列を処理するための完全なコード:

#include "cuda_runtime.h"
#include <stdio.h>

#define VECTOR_SIZE 8

__global__ void kernel(float* input, float* output)//, int halfSize)
{
    int dx = threadIdx.x + (blockDim.x * blockIdx.x);
    output[dx] = dx;
} 

int main()
{
    printf("Start\n");
    float *input_d;
    float *output_d;
    float output_h[VECTOR_SIZE];
    float input_h[VECTOR_SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8 }; 
    int size = VECTOR_SIZE*sizeof(float);
    cudaMalloc(&input_d,size);
    cudaMalloc(&output_d,size);
    cudaMemcpy(input_d,input_h,size,cudaMemcpyHostToDevice);
    kernel<<<1,VECTOR_SIZE>>>(input_d,output_d);
    cudaMemcpy(output_h,output_d,size, cudaMemcpyDeviceToHost);
    cudaFree(input_d);
    cudaFree(output_d);
    int i;
    for (i=1; i<=VECTOR_SIZE; i++)
    {
        printf("%d, ", output_h[i-1]);
    }
    getchar();
    return 0;
}
4

1 に答える 1