【发布时间】:2013-07-03 16:37:21
【问题描述】:
我的任务是使用 CUDA 实现图像重建算法代码。我获得了相同的 C 代码。代码的输入是一个 DAT 文件,其中包含 360 个大小为 640 x 480 的图像。代码如下所示:
FILE *in,*out;
float *i_data,*o_data;
i_data=(float *)malloc(mem_size);
for(int projection=0;projection<360;projection++)
{
in=fopen("filename.dat","rb");
fread(i_data,mem_size,1,in);
... some math ...
for(int slice_no=-240;slice_no<240:slice_no++)
{
for (i=-320;i<320;i++)
for (j=-320;j<320;j++)
{
// do some operations
(*(o_data*slice_no)+(j+320)+(i+240))+=(*(i_data*value)+(j+240)+(i+320));
// some more math
}
}
}
输出浮点指针被写回一个 dat 文件。如果我必须并行化这些循环,我将如何在 CUDA 中做到这一点?我尝试使用 640 个线程中的每个 640 个块在 CUDA 中实现内部两个 for 循环。如何将线程索引赋予循环内的指针操作。我试着给
int i=blockIdx.x;
int j=threadIdx.x;
and
kernel<<<640,640>>>
但这在输出指针中给出了错误的值。大多数是南。除了上面sn-p中显示的带有指针的行之外,我能够成功地实现其他数学。
谁能帮我做这件事?我在这段代码中做错了什么? 也可以在这里并行化所有的for循环吗?
【问题讨论】:
-
我看不出有人能告诉你你在这段代码中做错了什么。您显示的代码,即
i和j的分配以及(不完整的)内核调用是微不足道的,并不表示您在做什么。 -
@RobertCrovella:我想我发现我做错了。 cudaMalloc 为浮点数组提供随机值。这是造成问题的一个问题。你能帮我在 cudaMalloc 之后如何初始化浮点数组吗?我检查了这个答案link。但这仅适用于 int 我猜。你能告诉如何将浮点数组初始化为零吗?
标签: c loops image-processing cuda nested