在CUDA编程中,如果我们想要使用共享内存,我们需要将数据从全局内存带到共享内存.线程用于传输此类数据.
我在某处(在线资源中)读到最好不要将块中的所有线程都用于将数据从全局内存复制到共享内存.这样的想法是有道理的,所有线程不会一起执行.warp中的线程一起执行.但我担心的是所有的经线都没有按顺序执行.比如说,一个带有线程的块被分为3个warp:war p0(0-31个线程),warp 1(32-63个线程),warp 2(64-95个线程).不保证warp 0将首先执行(我是对的吗?).
那么我应该使用哪些线程将数据从全局复制到共享内存?
我有一个关于 CUDA C++ 编程的问题。我正在使用共享内存。但我需要更大的共享内存。所以我试图重用共享内存。我的代码是这样的:
__global__ void dist_calculation(...){
..........
{
//1st pass
__shared__ short unsigned int shared_nodes[(number_of_nodes-1)*blocksize];
............
}
{
//2nd pass
__shared__ float s_distance_matrix[(number_of_nodes*(number_of_nodes-1))/2];
........
}
}
Run Code Online (Sandbox Code Playgroud)
共享内存不能同时容纳shared_nodes和s_distance_matrix。但它可以单独容纳每个(我已经测试过)。在第二遍中,程序无法识别 shared_nodes(因为它来自第一遍),但向我显示共享内存没有足够空间的错误。所以看起来,仍然为shared_nodes变量分配了一些空间。有什么方法可以销毁该分配(例如cudaFree)?或任何其他建议?