gpt4 book ai didi

c++ - CUDA 内核自动调用内核完成 vector 加法。为什么?

转载 作者:行者123 更新时间:2023-11-28 00:38:15 25 4
gpt4 key购买 nike

我刚开始玩 CUDA,所以我尝试了教科书上的 vector 加法代码。然而,当我指定内核调用只添加 vector 的前半部分时,后半部分也会被添加!当我包含一些 thrust 库 header 时,此行为停止。

我完全糊涂了。请看下面的代码:

#include <iostream>
using namespace std;

__global__ void VecAdd(float *d_dataA, float *d_dataB, float *d_resultC)
{
//printf("gridDim.x is %d \n",gridDim.x);
int tid = blockIdx.x * blockDim.x + threadIdx.x;
// printf("tid is %d \n",tid);
d_resultC[tid] = d_dataA[tid] + d_dataB[tid];
}

int main()
{
const int ARRAY_SIZE = 8*1024;
const int ARRAY_BYTES = ARRAY_SIZE * sizeof(float);

float *h_dataA, *h_dataB, *h_resultC;
float *d_dataA, *d_dataB, *d_resultC;

h_dataA = (float *)malloc(ARRAY_BYTES);
h_dataB = (float *)malloc(ARRAY_BYTES);
h_resultC = (float *)malloc(ARRAY_BYTES);

for(int i=0; i<ARRAY_SIZE;i++){
h_dataA[i]=i+1;
h_dataB[i]=2*(i+1);
};

cudaMalloc((void **)&d_dataA,ARRAY_BYTES);
cudaMalloc((void **)&d_dataB,ARRAY_BYTES);
cudaMalloc((void **)&d_resultC,ARRAY_BYTES);

cudaMemcpy(d_dataA, h_dataA,ARRAY_BYTES, cudaMemcpyHostToDevice);
cudaMemcpy(d_dataB, h_dataB,ARRAY_BYTES, cudaMemcpyHostToDevice);

cout << h_resultC[0] << endl;
cout << h_resultC[ARRAY_SIZE-1] << endl;

dim3 dimBlock(ARRAY_SIZE/8,1,1);
dim3 dimGrid(1,1,1);

VecAdd<<<dimGrid,dimBlock>>>(d_dataA, d_dataB, d_resultC);

cout << h_resultC[0] << endl;
cout << h_resultC[ARRAY_SIZE-1] << endl;

cudaMemcpy(h_resultC,d_resultC ,ARRAY_BYTES,cudaMemcpyDeviceToHost);
cout << h_resultC[0] << endl;
cout << h_resultC[ARRAY_SIZE-1] << endl;

return 0;
}

最佳答案

您是否首先使用 ARRAY_SIZE 个线程启动它,然后使用其中的一半? (或 1/8)

您没有初始化 d_resultC,因此 d_resultC 可能具有先前执行的结果。这可以解释这种行为,但也许不能。

在 d_result_C 上添加一个 cudaMemset 并告诉我们发生了什么。

关于c++ - CUDA 内核自动调用内核完成 vector 加法。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20082172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com