我在GPU上定义了原始数据集 想通过GPU多线程并行处理把结果存放到结果集中。
我现在想测试GPU的多线程操作是非正确,于是我就用GPU做一个简单的操作:把原始数据拷贝到结果集中。
但是我拷贝后 在CPU上查看数据的时候 发现部分数据丢失了。
我的代码如下:
{
int index = TID;
int bid = BLOCK_ID;
int tid = THREAD_ID;
if (index*recordsPerTask >= recordNum) return;
int recordBase = bid * recordsPerTask * blockDim.x;
int terminate = (bid + 1) * (recordsPerTask * blockDim.x);
if (terminate > recordNum) terminate = recordNum;
for (int i = recordBase + tid; i < terminate; i+=blockDim.x)
{
int cindex = i;
int4 offsetSize = inputOffsetSizes[cindex];
char *key = inputKeys + offsetSize.x;
char *val = inputVals + offsetSize.z;
char buf = pKey->file_buf + block_offset;
int result_offset = TID1024;
StrCpy(d_resultSet+result_offset,buf,StrLen(buf)+1);
}
cudaThreadSynchronize();
其中d_resultSet是我定义的一个字符指针 分配的空间是1024*100 1024是一条记录的结果大小 100是记录数。 result_offset是定义的一个偏移量 我通过线程号乘以1024的方法让线程可以直接定位到结果数据的存放地址。
现在问题是:如果我通过拷贝固定数据, 查看结果是正确的(譬如:char* name =“aaaa” 然后拷贝name到d_resultSet中) 如果我直接对buf(原始数据)进行修改, 我查看结果也是正确的 但是就是从原始数据到结果集的拷贝会出现数据丢失情况。 请问这个是么回事啊?
谢谢各位大牛解答啊