【发布时间】:2012-04-18 20:11:54
【问题描述】:
这个内核正在做正确的事情,给了我正确的结果。如果我想提高性能,我的问题更多在于 while 循环的正确性。我尝试了几种块和线程的配置,但如果我要更改它们,while 循环不会给我正确的结果。 我在更改内核配置时获得的结果是 firstArray 和 secondArray 不会被完全填充(它们在单元格内将有 0)。两个数组都必须填充从 if 循环中获得的 curValue。
欢迎任何建议:)
提前谢谢你
#define N 65536
__global__ void whileLoop(int* firstArray_device, int* secondArray_device)
{
int curValue = 0;
int curIndex = 1;
int i = (threadIdx.x)+2;
while(i < N) {
if (i % curIndex == 0) {
curValue = curValue + curIndex;
curIndex *= 2;
}
firstArray_device[i] = curValue;
secondArray_device[i] = curValue;
i += blockDim.x * gridDim.x;
}
}
int main(){
firstArray_host[0] = 0;
firstArray_host[1] = 1;
secondArray_host[0] = 0;
secondArray_host[1] = 1;
// memory allocation + copy on GPU
// definition number of blocks and threads
dim3 dimBlock(1, 1);
dim3 dimGrid(1, 1);
whileLoop<<<dimGrid, dimBlock>>>(firstArray_device, secondArray_device);
// copy back to CPU + free memory
}
【问题讨论】:
-
这不是一个真正的优化问题——它是一个正确性问题,不是吗?
-
我猜你是对的。我将更改帖子的标题。
-
我不太明白这个问题...您到底想要什么建议?你说你的内核工作正常但是你的“正确性”有问题?
-
我的意思是,如果我更改内核的设置以提高性能,我将不会在数组中拥有正确的索引。所以我想知道是否有另一种方法可以在具有不同内核设置的数组中获得相同的结果。
-
@RogerDahl:基本上他的代码只能在串行运行(即一个线程)时才能工作。尝试运行更多,它会以多种方式中断,这都是因为代码错误和算法不正确。
标签: optimization cuda while-loop