我是CUDA的新手,並試圖弄清楚如何將2d數組傳遞給內核。 我有以下工作代碼爲一維數組:c#managedCuda二維數組到GPU
class Program
{
static void Main(string[] args)
{
int N = 10;
int deviceID = 0;
CudaContext ctx = new CudaContext(deviceID);
CudaKernel kernel = ctx.LoadKernel(@"doubleIt.ptx", "DoubleIt");
kernel.GridDimensions = (N + 255)/256;
kernel.BlockDimensions = Math.Min(N,256);
// Allocate input vectors h_A in host memory
float[] h_A = new float[N];
// Initialize input vectors h_A
for (int i = 0; i < N; i++)
{
h_A[i] = i;
}
// Allocate vectors in device memory and copy vectors from host memory to device memory
CudaDeviceVariable<float> d_A = h_A;
CudaDeviceVariable<float> d_C = new CudaDeviceVariable<float>(N);
// Invoke kernel
kernel.Run(d_A.DevicePointer, d_C.DevicePointer, N);
// Copy result from device memory to host memory
float[] h_C = d_C;
// h_C contains the result in host memory
}
}
用下面的內核代碼:
__global__ void DoubleIt(const float* A, float* C, int N)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < N)
C[i] = A[i] * 2;
}
正如我所說的,一切工作正常,但我想用二維數組如下工作:
// Allocate input vectors h_A in host memory
int W = 10;
float[][] h_A = new float[N][];
// Initialize input vectors h_A
for (int i = 0; i < N; i++)
{
h_A[i] = new float[W];
for (int j = 0; j < W; j++)
{
h_A[i][j] = i*W+j;
}
}
我需要的所有第二維是同一個線程,因此kernel.BlockDimensions必須保持爲1個捫sion和每個內核線程都需要獲得具有10個元素的1d數組。
所以我的底部問題是:我如何將這個2d數組複製到設備以及如何在內核中使用它? (至於它應該總共有10個線程的例子)。
我一直在努力與Cudafy多年,現在有同樣的問題。據我所知(我可能是錯的),目前還沒有支持Jagged Arrays的託管到CudaC轉換器。他們不正確地處理指針。我不熟悉的Managed Cuda可能會以不同的方式處理它。隨着Cudafy,你可以編寫你自己的Cuda C並加載它。爲了理解分配問題,試試這個:https://stackoverflow.com/questions/1047369/allocate-2d-array-on-device-memory-in-cuda –
我之前看到過這個對話,但並沒有真正理解它。 ..它說了一些關於'cudaMemcpy2D()'但它沒有在代碼中實現。無論如何,我的代碼是用c#編寫的,我想在c#中找到解決方案,導致我的所有程序都已經寫入了它。我知道在c/C++中threre是解決方案,但它並不能真正幫助我,我也無法將它翻譯成managedCuda。任何線索都會有幫助。 – TVC