【发布时间】:2019-05-27 10:58:42
【问题描述】:
我终于成功地在内存中保存了一个双指针,以便在 cuda 中使用它。(下面的代码),但我发现它的性能不如我将矩阵展平,这不是那么好。
一些节省时间/记忆的建议?
我真的很想使用动态二维数组。
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdlib.h>
#include <cstdio>
__global__ void fct(int **dev_c)
{
int y = threadIdx.x;
int x = threadIdx.y;
dev_c[y][x] = 3;
}
int main(void)
{
//Output Array
int **cc = new int*[2];
for (int i = 0; i < 2; i++)cc[i] = new int[2];
//Host Array
int ** h_c = (int **)malloc(2 * sizeof(int *));
for (int i = 0; i < 2; i++) {
cudaMalloc((void**)&h_c[i], 2 * sizeof(int));
}
//Devie array
int ** d_c;
cudaMalloc((void **)&d_c, 2 * sizeof(int *));
cudaMemcpy(d_c, h_c, 2 * sizeof(int *), cudaMemcpyHostToDevice);
dim3 d(2, 2);
fct << <1, d >> > (d_c);
for (int i = 0; i < 2; i++) {
cudaMemcpy(cc[i], h_c[i], 2 * sizeof(int), cudaMemcpyDeviceToHost);
}
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
printf("(%d,%d):%d\n", i, j, cc[i][j]);
}
}
int x;
std::cin >> x;
delete[] h_c;
delete[] d_c;
}
【问题讨论】:
-
如果您在编译时知道二维矩阵的宽度,则可以使用双下标访问(即使在设备代码中),同时仍保持索引访问与双指针访问的性能优势。这个answer 讨论了包括已知宽度方法在内的各种方法。如果您在编译时不知道 2D 矩阵的宽度,我不知道有任何方法可以在每次访问没有 2 个指针取消引用的情况下进行双下标访问。
-
谢谢!我会记住这一点,但遗憾的是,对于这个项目,我需要该数组是动态的。