試試這個 - 我測試了它在GTX 285 CUDA 3.2下 - 所以這是一個有點比目前的版本更加嚴格,但有用。
#include<stdio.h>
#include<string.h>
__global__ void setValues(char** word)
{
volatile char* myWord = word[blockIdx.x];
myWord[0] = 'H';
myWord[1] = 'o';
myWord[2] = 'l';
myWord[3] = 'a';
myWord[4] = '\0';
}
int main()
{
const size_t bufferSize = 32;
const int nObjects = 10;
char* h_x[nObjects];
char** d_x = 0;
cudaMalloc((void**)(&d_x), nObjects * sizeof(char*));
for (int i=0; i < nObjects; i++)
{
h_x[i] = NULL;
cudaMalloc((void**)(&h_x[i]), bufferSize * sizeof(char));
printf("h_x[%d] = %lx\n",i,(unsigned long)h_x[i]);
}
cudaMemcpy(d_x, h_x, nObjects*sizeof(char*), cudaMemcpyHostToDevice);
printf("Copied h_x[] to d_x[]\n");
char msg[] = "Hello World!";
cudaMemcpy(h_x[0], msg, 13*sizeof(char), cudaMemcpyHostToDevice);
/* Force Thread Synchronization */
cudaError err = cudaThreadSynchronize();
/* Check for and display Error */
if (cudaSuccess != err)
{
fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n",
__FILE__, __LINE__, cudaGetErrorString(err));
}
setValues<<<nObjects,1>>>(d_x);
/* Force Thread Synchronization */
err = cudaThreadSynchronize();
/* Check for and display Error */
if (cudaSuccess != err)
{
fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n",
__FILE__, __LINE__, cudaGetErrorString(err));
}
printf("Kernel Completed Successfully. Woot.\n\n");
char p[bufferSize];
printf("d_x = %lx\n", (unsigned long)d_x);
printf("h_x = %lx\n", (unsigned long)h_x);
cudaMemcpy(h_x, d_x, nObjects*sizeof(char*), cudaMemcpyDeviceToHost);
printf("d_x = %lx\n", (unsigned long)d_x);
printf("h_x = %lx\n", (unsigned long)h_x);
for (int i=0; i < nObjects; i++)
{
cudaMemcpy(&p, h_x[i], bufferSize*sizeof(char), cudaMemcpyDeviceToHost);
printf("%d p[] = %s\n",i,p);
}
/* Force Thread Synchronization */
err = cudaThreadSynchronize();
/* Check for and display Error */
if (cudaSuccess != err)
{
fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n",
__FILE__, __LINE__, cudaGetErrorString(err));
}
getchar();
return 0;
}
正如@喬恩筆記,你不能將X(因爲你已經聲明)它的GPU,因爲它是該生活在CPU上的地址。在上面的代碼中,我創建了一個char *的數組,並將它們傳遞給我也在GPU上分配的char **。希望這可以幫助!
當我添加一個手錶網格,它說網格沒有找到。 – Programmer
任何人都可以使用cuda機器爲我運行並檢查? – Programmer
你甚至沒有問題了。 – tkerwin