我试图在图像转换过程中实现相当简单的平均。我已经成功实现了转换,但现在我必须通过总结所有5x5像素矩形的所有像素来处理这个结果图像。我的想法是每当这个块中的像素被设置时,为每个这样的5x5块增加一个计数器。但是,这些块计数器到目前为止还没有足够的增量。因此,对于调试,我检查了这样一个块的任何像素被击中的频率:
<?= file_get_contents('https://www.instagram.com/{user-name}/media/'); ?>
内核的调用如下:
int x = (blockIdx.x*blockDim.x) + threadIdx.x;
int y = (blockIdx.y*blockDim.y) + threadIdx.y;
if((x<5)&&(y<5))
{
resultArray [0]++;
}
我希望resultArray [0]在内核执行后包含25,但它只包含1.这是否是由于CUDA编译器的一些优化?
答案 0 :(得分:2)
此:
(x<5)&&(y<5)
是写入后读取危险。
满足resultArray[0]
的所有线程都可能尝试从if((x<5)&&(y<5)) {
atomicAdd(&resultArray[0], 1);
}
同时进行读写操作。 CUDA执行模型不保证同步内存事务的顺序。
您可以使用原子内存事务来完成此工作,例如:
LotsofmydatainRdataframe <- read.xlsx(LotsofmydatainExcel.xlsm,sheetName="Deaths",as.data.frame=TRUE)
这将序列化内存事务并使计算正确。它也会对性能产生很大的负面影响。
您可能希望调查每个块使用缩减类型计算计算局部和,然后以原子方式或在主机上或在第二个内核中对块本地求和求和。