晚上好,
我正在尝试设计一个openCL内核来计算pi。这是学校的作业,我们被告知使用以下等式:
Pi / 4 = 1-1/3 + 1/5-1/7 + 1/9-...
这是我当前正在生成段错误的内核设计,我不确定为什么:
__kernel void calculatePi(int numIterations, __global float *outputPi, __local float* local_result, int numWorkers)
{
// Get global ID for worker
const uint gid = get_global_id(0);
const uint lid = get_local_id(0);
const uint offset = numIterations*gid*2;
float sum = 0.0f;
for (int i = 0; i < numWorkers; i++)
{
local_result[i] = 0.0f;
}
barrier(CLK_LOCAL_MEM_FENCE);
for (int i=0; i<numIterations; i++)
{
if (i % 2 == 0)
sum += 1 / (1 + 2*i + offset);
else
sum -= 1 / (1 + 2*i + offset);
}
local_result[gid] = sum;
barrier(CLK_GLOBAL_MEM_FENCE);
if (lid == 0)
{
outputPi[0] = 0;
for (int i = 0; i < numWorkers; i++)
{
outputPi[0] += local_result[i];
}
outputPi[0] *= 4;
}
}
基本上,我的思维过程是让16个工人并行。每个工人将采用numIterations项并确定pi的部分计算。在这种情况下,我还将numIterations使用16。这些术语是交替出现的,因此对于每个奇数项,我都会减去,而对偶数项我都会加。第一个工作人员负责计算前16个项,下一个工作人员负责计算接下来的16个项,依此类推以创建每个16位数字的16个部分和。一旦每个工人计算出自己的部分和,我就让第一个工人拿走所有的部分和并将其加起来发送出去。我还要乘以4来完成方程。
我的问题是我在主程序的以下行中不断遇到分段错误:
ret = clEnqueueReadBuffer(command_queue, result_buffer, CL_TRUE, 0, sizeof(result), &result, 0, NULL, NULL);
以下是可能导致此问题的“结果”的其他用法:
float result[1] = {0}; // Initialized at top of main
/* Create buffers to hold the text characters and count */
cl_mem result_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(result), result, NULL);
printf("Final calculated value: %f \n", result[0]);
任何人都可以让我了解为什么在尝试将结果缓冲区读回结果时出现段错误吗?
完整的代码可以在我的github中看到:https://github.com/TreverWagenhals/TreverWagenhals/tree/master/School/Heterogeneous%20Computing/Lab2
谢谢。
编辑:我发现了我的代码中的问题。我正在创建一个名为numWorkers的变量,并将其传递给内核参数之一,这显然是不正确的。在简化代码的过程中,我可以将其删除并直接使用global_size变量,该变量现在可以解决seg错误问题并在每次调用时显示数据。
现在我的内核出现问题,正在返回4而不是pi的值。如果看不到问题,我将进一步调试并创建一个新问题。我要