我面临奇怪的情况,即内核中的本地数组保持其先前运行的值,而新值是所有运行的累积结果。 我删除动态定义的数组。但是不断积累结果。 这是一个示例和代码如下: 第一轮结果是:
Before: 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
After: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,
然后下一次运行结果是:
Before: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,
After: 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 ,
依此类推,之前的运行值不会被清除。问题在哪里是故障?以及如何解决它。
我的环境是:
操作系统:Linux SL7
GPU:Tesla K20m(SM_35)
CUDA版本:8.0
这是我的代码:
#include <iostream>
#include <numeric>
#include <stdlib.h>
#include <stdio.h>
__global__ void myKernel(int *data, int vectorSize)
{
int const size = vectorSize;
int *countArray = new int[size];
/*Print array values before modifications*/
printf("\nBefore: ");
for (int i = 0; i < vectorSize; ++i)
{
printf("%d , ", countArray[i]);
}
/*Modifying array values*/
for (int i = 0; i < vectorSize; ++i)
{
countArray[i] += data[i];
}
printf("\nAfter: ");
/*Print array values after modifications*/
for (int i = 0; i < vectorSize; ++i)
{
printf("%d , ", countArray[i]);
}
printf("\n");
delete[] countArray;
}
int main(void)
{
const int size = 9;
int array[size] ={1, 2, 3, 4, 5, 6, 7, 8, 9};
int *dev_array;
cudaMalloc((void**) &dev_array, size * sizeof(int));
cudaMemcpy(dev_array, array, size * sizeof(int), cudaMemcpyHostToDevice);
myKernel<<<1, 1>>>(dev_array, size);
cudaFree(dev_array);
return 0;
}
答案 0 :(得分:3)
我认为您需要在使用之前将countArray
显式初始化为零。未初始化的数组可以包含任何值。只是做
for (int i = 0; i < vectorSize; ++i)
{
countArray[i] = 0;
}
在使用countArray
之前。