CUDA編程指南指出:「通過malloc()
分配的內存可以使用運行時進行復制(即通過調用設備內存中的任何複製內存功能)」,但不知何故我無法重現此功能。代碼:複製到由malloc()分配的全局內存?
#include <cstdio>
__device__ int* p;
__global__ void allocate_p() {
p = (int*) malloc(10);
printf("p = %p (seen by GPU)\n", p);
}
int main() {
cudaError_t err;
int* localp = (int*) malloc(10);
allocate_p<<<1,1>>>();
cudaDeviceSynchronize();
//Getting pointer to device-allocated memory
int* tmpp = NULL;
cudaMemcpyFromSymbol(&tmpp, p, 4);
printf("p = %p (seen by CPU)\n", tmpp);
//cudaMalloc((void**)&tmpp, 40);
err = cudaMemcpy(tmpp, localp, 40, cudaMemcpyHostToDevice);
cudaDeviceSynchronize();
printf(" err:%i %s", (int)err, cudaGetErrorString(err));
delete localp;
return 0;
}
崩潰,輸出:
p = 0x601f920 (seen by GPU)
p = 0x601f920 (seen by CPU)
err:11 invalid argument
我推測,在主機上看到設備的相應地址,但不知何故不喜歡它malloc()
到來。
如果我分配早些時候cudaMalloc((void**)&np, 40);
然後傳遞指針np
作爲參數內核allocate_p
,在那裏將被分配到p
(代替malloc()
),則代碼運行正常。
我在做什麼錯誤/我們如何在主機端函數中使用malloc()
分配的設備內存?
您引用的部分來自「B.17.2與主機內存API的互操作性」部分。 malloc()指的是主機malloc()而不是設備malloc()。考慮到引入設備malloc()的「B.17.1堆內存分配」部分,這是非常令人困惑的。 –
@GregSmith:我不明白你是如何達到這種解釋的。該部分是關於設備動態內存分配(甚至有代碼示例顯示內核malloc調用),並且參考是在第3.2.2節中介紹的主機內存API函數,即。 cudaMemcpy。 *主機* malloc進入圖片的位置在哪裏?我不會說它是混淆編寫的,我會說這只是錯誤的(或者在運行時有一個巨大的錯誤作爲替代)。 – talonmies
@部分是的,該部分在較舊的手冊中是錯誤的,並被複制到不同的位置。該聲明應從編程指南的下一個版本中刪除。 –