0

我有一个内核函数,它只将数字写入 __global int* c 具体来说它看起来像这样:

__kernel void Add1(__global int* c)
{
    *c = 3;
}

在主机代码中,我为 C 值分配了内存:

cl_mem bufferC[deviceNumber]; // deviceNumber = 8
for(int i = 0; i< deviceNumber; i++){
bufferC[i] = clCreateBuffer(context[i], CL_MEM_WRITE_ONLY, sizeof(cl_int) * global_size, NULL, &error);
}

for(int i = 0; i< deviceNumber; i++){
    error = clSetKernelArg(kernel[i], 0, sizeof(cl_mem), (void*)&bufferC[i]);
}

for(int i = 0; i< deviceNumber; i++){
    error = clEnqueueReadBuffer(commandQueue[i], bufferC[i], CL_TRUE, 0, sizeof(cl_int) * global_size, &c[i], 0, NULL, NULL);
}

我像这样打印它:

for (size_t i = 0; i < deviceNumber; ++i)
{
    std::cout<< "delta = " << c[i] << std::endl;
}

和输出:

delta = 3
delta = 11165
delta = -1329524360
delta = 11165
delta = 0
delta = 0
delta = -1329520352
delta = 11165

所以第一个值是好的,其余的有点垃圾,你知道我写错了什么吗?当然,这只是部分代码,但我认为我粘贴了有关“c”值的所有行。全局大小设置为 1。

4

1 回答 1

0

好吧,我的错误是创建了多个上下文,但在参数中我放置了一个设备而不是它们的数组。但是我通过在程序中打印错误代码找到了它——如果你有一些问题,请尝试这样做!干杯

于 2016-12-21T19:29:49.143 回答