用pthread进行cuda编程 #包括 #包括 #包括 #定义ARR_尺寸10 #定义NUM_设备1 类型定义结构{ int*arr; 国际开发署; int*dev_结果; int*结果; int-num; }库达乌街; __全局无效内核(int*dev\u arr,int*dev\u结果) { int idx=threadIdx.x; printf(“dev_arr[%d]=%d\n”,idx,dev_arr[idx]); 原子添加(dev_result,dev_arr[idx]); } void*thread_func(void*struc) { cuda_st*数据=(cuda_st*)结构; printf(“线程%d函数开始\n”,数据->数值); printf(“arr%d=,data->num); 对于(int i=0;iarr[i]); } printf(“\n”); cudaSetDevice(数据->数值); cudaMemcpy(数据->开发arr,数据->arr,sizeof(int)*arr\u大小,cudaMemcpyHostToDevice); 内核(数据->开发arr,数据->开发结果); cudaMemcpy(数据->结果,数据->开发结果,sizeof(int),cudaMemcpyDeviceToHost); printf(“线程%d函数退出\n”,数据->数值); 返回NULL; } 内部主(空) { //制造对象 cuda_st cuda[数字设备]; //制线 pthread_t pthread[NUM_DEVICE]; //主机阵列内存分配 int*arr[NUM_设备]; 对于(int i=0;i

用pthread进行cuda编程 #包括 #包括 #包括 #定义ARR_尺寸10 #定义NUM_设备1 类型定义结构{ int*arr; 国际开发署; int*dev_结果; int*结果; int-num; }库达乌街; __全局无效内核(int*dev\u arr,int*dev\u结果) { int idx=threadIdx.x; printf(“dev_arr[%d]=%d\n”,idx,dev_arr[idx]); 原子添加(dev_result,dev_arr[idx]); } void*thread_func(void*struc) { cuda_st*数据=(cuda_st*)结构; printf(“线程%d函数开始\n”,数据->数值); printf(“arr%d=,data->num); 对于(int i=0;iarr[i]); } printf(“\n”); cudaSetDevice(数据->数值); cudaMemcpy(数据->开发arr,数据->arr,sizeof(int)*arr\u大小,cudaMemcpyHostToDevice); 内核(数据->开发arr,数据->开发结果); cudaMemcpy(数据->结果,数据->开发结果,sizeof(int),cudaMemcpyDeviceToHost); printf(“线程%d函数退出\n”,数据->数值); 返回NULL; } 内部主(空) { //制造对象 cuda_st cuda[数字设备]; //制线 pthread_t pthread[NUM_DEVICE]; //主机阵列内存分配 int*arr[NUM_设备]; 对于(int i=0;i,cuda,pthreads,Cuda,Pthreads,问题在于在一个设备上分配内存。在调用cudamaloc之前,需要调用cudaSetDevice: #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define ARR_SIZE 10 #define NUM_DEVICE 1 typedef struct { int *arr; int *dev_arr; int *dev_result; int *r

问题在于在一个设备上分配内存。在调用
cudamaloc
之前,需要调用
cudaSetDevice

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define ARR_SIZE    10
#define NUM_DEVICE  1

typedef struct {
   int *arr;
   int *dev_arr;
   int *dev_result;
   int *result;
   int num;
} cuda_st;

__global__ void kernel_fc(int *dev_arr, int *dev_result)
{
    int idx = threadIdx.x;
    printf("dev_arr[%d] = %d\n", idx, dev_arr[idx]);
    atomicAdd(dev_result, dev_arr[idx]);
}

void *thread_func(void* struc)
{
    cuda_st * data = (cuda_st*)struc;
    printf("thread %d func start\n", data->num);
    printf("arr %d = ", data->num);
    for(int i=0; i<10; i++) {
        printf("%d ", data->arr[i]);
    }
    printf("\n");
    cudaSetDevice(data->num);
    cudaMemcpy(data->dev_arr, data->arr,  sizeof(int)*ARR_SIZE, cudaMemcpyHostToDevice);
    kernel_fc<<<1,ARR_SIZE>>>(data->dev_arr, data->dev_result);
    cudaMemcpy(data->result, data->dev_result, sizeof(int), cudaMemcpyDeviceToHost);
    printf("thread %d func exit\n", data->num);
    return NULL;
}

int main(void)
{
    // Make object
    cuda_st cuda[NUM_DEVICE];

    // Make thread
    pthread_t pthread[NUM_DEVICE];

    // Host array memory allocation
    int *arr[NUM_DEVICE];
    for(int i=0; i<NUM_DEVICE; i++) {
        arr[i] = (int*)malloc(sizeof(int)*ARR_SIZE);
    }

    // Fill this host array up with specified data
    for(int i=0; i<NUM_DEVICE; i++) {
        for(int j=0; j<ARR_SIZE; j++) {
            arr[i][j] = i*ARR_SIZE+j;
        }
    }

    // To confirm host array data
    for(int i=0; i<NUM_DEVICE; i++) {
        printf("arr[%d] = ", i);
        for(int j=0; j<ARR_SIZE; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    // Result memory allocation
    int *result[NUM_DEVICE];
    for(int i=0; i<NUM_DEVICE; i++) {
        result[i] = (int*)malloc(sizeof(int));
        memset(result[i], 0, sizeof(int));
    }

    // Device array memory allocation
    int *dev_arr[NUM_DEVICE];
    for(int i=0; i<NUM_DEVICE; i++) {
        cudaMalloc(&dev_arr[i], sizeof(int)*ARR_SIZE);
    }

    // Device result memory allocation
    int *dev_result[NUM_DEVICE];
    for(int i=0; i<NUM_DEVICE; i++) {
        cudaMalloc(&dev_result[i], sizeof(int));
        cudaMemset(dev_result[i], 0, sizeof(int));
    }

    // Connect these pointers with object
    for(int i=0; i<NUM_DEVICE; i++) {
        cuda[i].arr = arr[i];
        cuda[i].dev_arr = dev_arr[i];
        cuda[i].result = result[i];
        cuda[i].dev_result = dev_result[i];
        cuda[i].num = i;
     }

    // Create and excute pthread
    for(int i=0; i<NUM_DEVICE; i++) {
        pthread_create(&pthread[i], NULL, thread_func, (void*)&cuda[i]);
    }

    // Join pthread
    for(int i=0; i<NUM_DEVICE; i++) {
        pthread_join(pthread[i], NULL);
    }

    for(int i=0; i<NUM_DEVICE; i++) {
        printf("result[%d] = %d\n", i, (*cuda[i].result));
    }

    return 0;
}
//设备阵列内存分配
int*dev_arr[NUM_DEVICE];

对于(int i=0;i有多少个GPU?只有2个设备,并且两者都是GTX580。如果您只有一个设备,并且您希望使用pthread,如上图所示,则删除cudaSetDevice(数据->num);它应该可以正常工作..Eric/我理解你的意思,但是我如何将你的想法应用到我的源代码中?哦,那么你可以尝试添加错误检查,如果cuda调用cudaSetDevice成功与否?哦,我错过了。谢谢!
// Device array memory allocation
int *dev_arr[NUM_DEVICE];
for(int i=0; i<NUM_DEVICE; i++) {
    cudaSetDevice(i);
    cudaMalloc(&dev_arr[i], sizeof(int)*ARR_SIZE);
}

// Device result memory allocation
int *dev_result[NUM_DEVICE];
for(int i=0; i<NUM_DEVICE; i++) {
    cudaSetDevice(i);
    cudaMalloc(&dev_result[i], sizeof(int));
    cudaMemset(dev_result[i], 0, sizeof(int));
}